LC 890. 查找和替换模式 (opens new window) (opens new window)
中等
# 问题描述
你有一个单词列表 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 <= 50
1 <= pattern.length = words[i].length <= 20
# 双向映射
建立 到 和 到 的双向映射关系表,然后检查 和 中每一个字母的映射关系是否一致,如果双方映射关系是匹配的,则说明是符合要求的。
/**
* @param {string[]} words
* @param {string} pattern
* @return {string[]}
*/
var findAndReplacePattern = function (words, pattern) {
const ptow = new Map()
const wtop = new Map()
const n = pattern.length
const ans = []
label: for (const word of words) {
ptow.clear()
wtop.clear()
for (let i = 0; i < n; i++) {
const p = pattern[i]
const w = word[i]
if (ptow.has(p) || wtop.has(w)) {
if (ptow.get(p) !== w || wtop.get(w) !== p) continue label
} else {
ptow.set(p, w)
wtop.set(w, p)
}
}
ans.push(word)
}
return ans
}
- 时间复杂度:, 为 长度, 为 长度
- 空间复杂度:
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!