持续创作,加速成长!这是我参与「掘金日新计划 · 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, ...} 不是排列。
因为 a 和 b 映射到同一个字母。
提示:
1 <= words.length <= 501 <= 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函数需要两个字符串全部符合要求。