592 · 查找和替换模式

步骤 1:理解题意

"模式匹配" = 单词与 pattern 长度相同,且字符间双射 (一一对应,无重复映射)。

即:

  • 同一字母在 pattern 中多次出现,必须映射到单词的同一字母;
  • 不同字母不能映射到同一字母(双向唯一)。

步骤 2:写出暴力/朴素解法

对每单词,建两个 Map<Character, Character> 分别记录 pattern→word 与 word→pattern 的映射,中途冲突即不匹配。

时间 O(N·L),N 为 words 长度,L 为单词长度。

步骤 3:寻找冗余与优化点

  • 只需一次遍历即可同时检查双向映射,无需两个 map。
  • 用长度 26 的数组代替 HashMap,更快。
  • 提前长度不等直接跳过。

步骤 4:给出最优"快刷"版本

java 复制代码
public List<String> findAndReplacePattern(String[] words, String pattern) {
    List<String> ans = new ArrayList<>();
    char[] p = pattern.toCharArray();
    for (String w : words) {
        if (w.length() != p.length) continue;
        char[] s = w.toCharArray();
        char[] map1 = new char[26], map2 = new char[26];
        boolean ok = true;
        for (int i = 0; i < s.length; i++) {
            char a = p[i], b = s[i];
            // 建立双向映射
            if (map1[a - 'a'] == 0) map1[a - 'a'] = b;
            if (map2[b - 'a'] == 0) map2[b - 'a'] = a;
            if (map1[a - 'a'] != b || map2[b - 'a'] != a) {
                ok = false; break;
            }
        }
        if (ok) ans.add(w);
    }
    return ans;
}
  • 时间:O(N·L)
  • 空间:O(1)(固定 52 字节数组)
  • 可直接 copy 通过 LintCode 1592。
相关推荐
代码不停8 分钟前
BFS解决floodfill算法题目练习
算法·宽度优先
上弦月-编程14 分钟前
C语言指针从入门到实战
java·jvm·算法
WL_Aurora15 分钟前
Python 算法基础篇之树和二叉树
python·算法
txzrxz16 分钟前
关于前缀和
算法·动态规划·图论
杨连江18 分钟前
载流子矩阵限域束缚实现常温常压超导的理论与结构设计
算法
做cv的小昊27 分钟前
【TJU】研究生应用统计学课程笔记(6)——第二章 参数估计(2.4 区间估计)
人工智能·笔记·线性代数·算法·机器学习·数学建模·概率论
普贤莲花34 分钟前
【2026年第18周---写于20260501】---舍得
程序人生·算法·leetcode
2zcode34 分钟前
基于深度学习的口腔疾病图像识别系统(UI界面+改进算法+数据集+训练代码)
人工智能·深度学习·算法
Sarvartha44 分钟前
N 个字符串最长公共子序列(LCS)求解问题
数据结构·算法
一切皆是因缘际会44 分钟前
下一代 AI 架构:基于记忆演化与单向投影的安全智能系统
大数据·人工智能·深度学习·算法·安全·架构