Leetcode 290. 单词规律
双HashMap + 单次遍历 + split,加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!
class Solution {
public boolean wordPattern(String pattern, String s) {
// 构造两个HashMap,分别用来存储双向键值对
Map<String,Character> str2char = new HashMap<String,Character>();
Map<Character,String> char2str = new HashMap<Character,String>();
// 将s切割成一个个的单词,用数组存储
String[] str_list = s.split(" ");
// 位数不相等那必然不可能匹配的,直接false
if (pattern.length() != str_list.length){
return false;
}
// System.out.println(str_list);
for (int c = 0; c < pattern.length(); c++){
// 正常操作,判断遍历到的键在不在str2char中,如果在就判断其值是否等于同索引的pattern的值,如果不等说明不匹配,直接返回false
if (str2char.containsKey(str_list[c]) && str2char.get(str_list[c]) != pattern.charAt(c)){
return false;
}
/**
必须要加这个if,否则如果这种"abba" ; "dog cat cat fish"情况下,最后a和fish肯定是不匹配的;
但是上面的判断会发现str2char中没有fish,会直接不满足往下走,这是不对的;
加了第二轮判断后,很明显a已经在char2str中了,但是我们发现a的值是dog,而不是fish,所以直接返回false,就可以完美解决这个问题;
*/
// 此外还需要注意这里str_list[c]是String,需要使用equals进行判断
if (char2str.containsKey(pattern.charAt(c)) && !char2str.get(pattern.charAt(c)).equals(str_list[c])){
return false;
}
// 将双向键值对分别添加到两个HashMap中
char2str.put(pattern.charAt(c),str_list[c]);
str2char.put(str_list[c],pattern.charAt(c));
}
return true;
}
}