查找和替换模式

你有一个单词列表 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
var findAndReplacePattern = function(words, pattern) {
/* 遍历模式,与word建立映射 */
let check=function(word,pattern_inner){
let map = {}
for(let p of pattern){
map[p]=undefined
}
let mapped_arr = []
for(let i = 0;i<pattern_inner.length; i++){
let key = pattern_inner[i]
let val = word[i]
if(map[key] === undefined){
map[key] = val
/* 如果发现数组中已经存在,则表示有两个pattern对应到了同一个word,表示不匹配 */
if(mapped_arr.indexOf(val)!==-1){
return false
}
/* 每次成功匹配一对,将配对中的word值记录到数组中 */
mapped_arr.push(val)
}else {
/* 在map中已存在pattern到word的映射时,如果有相同pattern而word不同的情况,表示不匹配 */
if(map[key]!==val){
return false
}
}
}
return true
}

let arr = []
for(let word of words){
if(check(word,pattern)){
arr.push(word)
}
}
return arr
};