「LeetCode」890-查找和替换模式

110 阅读1分钟

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

一.题目:

890. 查找和替换模式 你有一个单词列表 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 <= 50
  • 1 <= pattern.length = words[i].length <= 20

二、思路分析:

还是根据题目的要求来作答,题目给定单词的列表和一个模式,要求单词列表里符合要求的单词能够完全匹配模式,而且题目还要求是字母到字母的双射,所以我们的模式里面的字符也需要符合单词列表某些单词的顺序模式,所以基本步骤为:

  • 因为我们需要构成双映射所以我们构建的函数的参数单词列表需要和模式字符串相互构成映射,如果不符合直接返回false
  • 每次循环需要进行条件判断:如果Map里面没有特定字符的话,那么我们就将字符添加一个映射对应单词字符->映射字符;如果有这个字符的话,需要判断value值是否对应,如果不对应直接返回false

三、代码:

function findAndReplacePattern(words: string[], pattern: string): string[] {
    let res = [];
    for(const word of words){
        if(isMatch(word, pattern) && isMatch(pattern, word)){
            res.push(word);
        }
    }
    return res;
};
const isMatch = (word: string,pattern: string): boolean => {
        const map = new Map();
        for(let i=0 ; i<word.length ; i++){
            //map是否有映射
            if(!map.has(word[i])){
                map.set(word[i],pattern[i])
            }else if(map.get(word[i]) !== pattern[i]){
                return false;
            }
        }
        return true;
    }

四、总结:

做到道题目的时候需要做到仔细审题,因为需要构成双映射,所以我们的isMatch函数需要两个字符串全部符合要求。