leetcode
leetcode 801 ~ 850
查找和替换模式

查找和替换模式

难度:

标签:

题目描述

代码结果

运行时间: 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中找到w后还需要检查p是否不在dp2中,是为了确保模式字符串p到单词字符串w的映射也是一一对应的。如果在dp1中找到了w,说明我们已经为w定义了一个映射目标p,此时如果p不在dp2中,或者p在dp2中但映射的不是w,那么就破坏了一一对应的关系。这种情况可能在输入中有重复字符的单词或模式字符串时发生,例如单词'abba'和模式'noon',在遍历到最后一个字符时,'a'和'n'应该形成映射,但如果之前的映射已经建立且不一致,则会有问题。
🦆
在解题思路中,如果遇到没有映射关系的字符,为什么要同时更新dp1和dp2两个哈希表?更新一个不是足够的吗?
在解题思路中,遇到没有映射关系的字符时,需要同时更新dp1和dp2两个哈希表以保持这两个映射的一致性和完整性。dp1记录单词到模式的映射,而dp2记录模式到单词的映射。如果只更新一个哈希表,将无法确保另一个方向的映射正确,这可能导致后续字符映射检查时出现错误。更新两个表确保了无论从单词到模式还是从模式到单词的映射都是正确和一致的。
🦆
代码中对于`if w in dp1`和`if p in dp2`两个条件的处理逻辑是否完全对称?如果不对称,原因是什么?
代码中对于`if w in dp1`和`if p in dp2`的处理逻辑基本上是对称的,但在实际应用中可能略显不对称。这是因为这两个条件各自验证的是从单词到模式和从模式到单词的映射关系。尽管逻辑上这两个条件应该对称,但在具体实现时,它们的检查顺序和映射的更新时机可能略有不同,这主要取决于代码编写者的逻辑组织方式。
🦆
在判断`if p!=dp1[w]`时,为什么不需要额外判断`w!=dp2[p]`?这两个条件在逻辑上是否等价?
在判断`if p!=dp1[w]`时,确实不需要额外判断`w!=dp2[p]`,因为这两个条件在逻辑上是等价的。如果`p!=dp1[w]`成立,意味着已经存在一个不一致的映射关系,即当前的模式字符p已经被映射到一个与当前单词字符w不同的字符。由于映射是双向一致的,这自然意味着`w!=dp2[p]`也会成立。因此,只需要检查其中一个条件即可确认映射关系是否破坏。

相关问题