刷完LeetCode题库——890.查找和替换模式

159 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

题目详情

LeetCode题库序号 890. 查找和替换模式 ,难度为 中等

Tag : 「哈希表」、「模拟」

你有一个单词列表 words 和一个模式  pattern,你想知道 words 中的哪些单词与模式匹配。

如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之后,我们就得到了所需的单词,那么单词与模式是匹配的。

(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母,没有两个字母映射到同一个字母。)

返回 words 中与给定模式匹配的单词列表。

你可以按任何顺序返回答案。

示例:

输入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"
输出:["mee","aqq"]
解释:
"mee" 与模式匹配,因为存在排列 {a -> m, b -> e, ...}。
"ccc" 与模式不匹配,因为 {a -> c, b -> c, ...} 不是排列。
因为 ab 映射到同一个字母。

提示:

  • 1<=words.length<=501 <= words.length <= 50
  • 1<=pattern.length=words[i].length <=201 <= pattern.length = words[i].length <= 20

运用哈希表

首先题目中的意思要求字母与模式之间的字符要进行一一匹配,说明字符之间形成了一个唯一映射组合,a与b映射成功了,那么后面的a字符也只能与b进行映射,假如发现与a映射的字符不是b,那么可以得出该字符与模式不匹配,所以根据这个特性,我们可以通过一个Map来记录这些唯一的映射组合。

题解代码如下

public class Solution {

    public List<String> findAndReplacePattern(String[] words, String pattern) {
        List<String> ans = new ArrayList<>();
        for (String word : words) {
            if (matchPattern(word, pattern) && matchPattern(pattern, word)) {
                ans.add(word);
            }
        }
        return ans;
    }

    public boolean matchPattern(String word, String pattern) {
        Map<Character, Character> mapping = new HashMap<Character, Character>();
        for (int i = 0; i < word.length(); i++) {
            char x = word.charAt(i);
            char y = pattern.charAt(i);

            if (!mapping.containsKey(x)) {
                mapping.put(x, y);
            } else if (mapping.get(y) != x) {
                return false;
            }
        }

        return true;
    }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.890 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…