当前位置 博文首页 > Inmaturity_7的博客:算法练习帖--30--单词规律(Java)
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
(题目来源:力扣(LeetCode))
示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:
输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:
输入: pattern = "abba", str = "dog dog dog dog"
输出: false
package com.lxf.test;
import java.util.HashMap;
import java.util.Map;
public class WordPattern {
public static void main(String[] args) {
//"abba"
///"dog cat cat dog"
System.out.println(wordPattern("aaaa","dog cat cat dog"));
}
public static boolean wordPattern(String pattern, String s) {
//将s字符串分割成字符串数组
String[] sArr=s.split(" ");
//获取s字符串数组的长度
int sL=sArr.length;
//排除一些特殊情况
if(sL!=pattern.length()||pattern.equals("")||s.equals("")) {
return false;
}
//存储映射值得map集合
Map<Character, String> map=new HashMap<Character, String>();
//循环比较
for (int i = 0; i <sL; i++) {
if(!map.containsKey(pattern.charAt(i))) {
if(map.containsValue(sArr[i])) {
//如果已经有这个映射值了,说明冲突了直接返回false
return false;
}
//如果map中没有这个key和这个value,则把映射设置进去
map.put(pattern.charAt(i), sArr[i]);
}else {
//含有这个映射得时候,比较映射是否正确
if(!map.get(pattern.charAt(i)).equals(sArr[i])) {
return false;
}
}
}
//循环所有映射都正确就返回true
return true;
}
}
class Solution {
public boolean wordPattern(String pattern, String str) {
Map<String, Character> str2ch = new HashMap<String, Character>();
Map<Character, String> ch2str = new HashMap<Character, String>();
int m = str.length();
int i = 0;
for (int p = 0; p < pattern.length(); ++p) {
char ch = pattern.charAt(p);
if (i >= m) {
return false;
}
int j = i;
while (j < m && str.charAt(j) != ' ') {
j++;
}
String tmp = str.substring(i, j);
if (str2ch.containsKey(tmp) && str2ch.get(tmp) != ch) {
return false;
}
if (ch2str.containsKey(ch) && !tmp.equals(ch2str.get(ch))) {
return false;
}
str2ch.put(tmp, ch);
ch2str.put(ch, tmp);
i = j + 1;
}
return i >= m;
}
}
cs