1、题目描述
2、解题思路
本题的关键在于,遍历句子的单词时,如何能快速从 pairs 中查询单词是否相似。
考虑到在 pairs 中,一个单词可能有多个相似单词存在,因此,建立一个 HashMap<String, List> 来保存 pairs 的信息。
1、遍历 pairs,判断 pairs[i][0] 是否存在于 map 的 key 中:
1.1 若存在,则取出 map 中该 key 为 pairs[i][0] 的 value ,是一个 List,把 pairs[i][1]] 插入即可;
1.2 若不存在,则创建一个 List,把 pairs[i][i] 插入到 List 中,接着 put 到 map 中
2、第一步结束后,pairs 的信息就保存在 map 中了,接着开始遍历句子:
2.1 如果 word1[i] == word2[i],则跳过,接着遍历下一个单词;不等于则进入下一步;
2.2 判断 map 中有没有 key 为 word1[i] 的 value;如果有,则取出这个 value,是一个 list,判断 list 中是否有 word2[i],有则说明两个单词相似,接着遍历下一个单词;没有 key ,或者 list 没有 word2[i],接着下一步;
2.3 和 2.2 一样,只是把 word2[i] 当成 key,然后从 list 中找 word1[i]。
2.4 如果上面三步都没有 continue,说明三个都不满足,当前遍历到的两个单词不相似,返回 false。
3、遍历完所有单词都没有返回 false,说明全部相似,返回true。
3、解题代码
class Solution {
public boolean areSentencesSimilar(String[] words1, String[] words2, List<List<String>> pairs) {
if (words1.length != words2.length) return false;
Map<String, List<String>> map = new HashMap<>();
List<String> list;
for (List<String> pair : pairs) {
if (map.containsKey(pair.get(0))) {
list = map.get(pair.get(0));
list.add(pair.get(1));
map.put(pair.get(0), list);
} else {
list = new ArrayList<>();
list.add(pair.get(1));
map.put(pair.get(0), list);
}
}
for (int i = 0; i < words1.length; i++) {
if (!words1[i].equals(words2[i])) {
if (map.containsKey(words1[i]) &&
map.get(words1[i]).contains(words2[i])) {
continue;
}
if (map.containsKey(words2[i]) &&
map.get(words2[i]).contains(words1[i])) {
continue;
}
return false;
}
}
return true;
}
}