查找和替换模式
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 0.0 MB
/*
* 思路:
* 1. 使用流处理来遍历和过滤单词。
* 2. 使用辅助函数检查单词是否匹配模式。
*/
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.HashMap;
public class Solution {
public List<String> findAndReplacePattern(String[] words, String pattern) {
return Arrays.stream(words)
.filter(word -> matches(word, pattern))
.collect(Collectors.toList());
}
private boolean matches(String word, String pattern) {
if (word.length() != pattern.length()) {
return false;
}
Map<Character, Character> mapWordToPattern = new HashMap<>();
Map<Character, Character> mapPatternToWord = new HashMap<>();
for (int i = 0; i < word.length(); i++) {
char w = word.charAt(i);
char p = pattern.charAt(i);
if (!mapWordToPattern.containsKey(w)) {
mapWordToPattern.put(w, p);
}
if (!mapPatternToWord.containsKey(p)) {
mapPatternToWord.put(p, w);
}
if (mapWordToPattern.get(w) != p || mapPatternToWord.get(p) != w) {
return false;
}
}
return true;
}
}
解释
方法:
该题解的思路是利用两个哈希表 dp1 和 dp2 来记录单词和模式之间的映射关系。遍历单词和模式的每个字符,对于当前的字符 w 和 p,如果 w 已经在 dp1 中出现过,则判断 p 是否等于 dp1[w],如果不相等则说明不满足双射关系,返回 False。同时还需判断 p 是否在 dp2 中出现,如果 p 不在 dp2 中,说明存在两个字母映射到同一个字母的情况,返回 False。如果 p 在 dp2 中,则判断 w 是否等于 dp2[p],如果不相等则返回 False。如果 w 不在 dp1 中,则判断 p 是否在 dp2 中,如果在则返回 False,否则将 w 和 p 的映射关系分别加入 dp1 和 dp2 中。最后遍历完整个单词和模式,如果满足双射关系则返回 True,否则返回 False。对于每个单词都调用 mapTo 函数进行判断,将满足条件的单词加入结果列表中返回。
时间复杂度:
O(n*m)
空间复杂度:
O(n+m)
代码细节讲解
🦆
为什么在哈希表dp1中找到w后还需要检查p是否不在dp2中?这种情况在什么样的输入下会发生?
▷🦆
在解题思路中,如果遇到没有映射关系的字符,为什么要同时更新dp1和dp2两个哈希表?更新一个不是足够的吗?
▷🦆
代码中对于`if w in dp1`和`if p in dp2`两个条件的处理逻辑是否完全对称?如果不对称,原因是什么?
▷🦆
在判断`if p!=dp1[w]`时,为什么不需要额外判断`w!=dp2[p]`?这两个条件在逻辑上是否等价?
▷