题目
leetCode链接:https://leetcode.cn/problems/find-and-replace-pattern/
- 查找和替换模式
你有一个单词列表 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 映射到同一个字母。
思路
简单映射模拟题,满足正反双映射均符合条件则符合对应模式匹配。
解题
python实现
class Solution:
def match(self, word:str, pattern: str)->bool:
# 从i映射到j
mapping = {}
for i,j in zip(word,pattern):
if i not in mapping.keys():
mapping[i]=j
if mapping[i]!=j:
return False
return True
def findAndReplacePattern(self, words: List[str], pattern: str) -> List[str]:
return [word for word in words if self.match(word,pattern) and self.match(pattern,word)]
golang实现
func findAndReplacePattern(words []string, pattern string) []string {
var result []string
for _,word := range words {
if match(word,pattern) && match(pattern,word){
result = append(result,word)
}
}
return result
}
func match(word string, pattern string) bool {
mapping := map[rune]byte{}
for k,v := range word {
if _,ok := mapping[v];!ok{
mapping[v]=pattern[k]
}
if mapping[v]!=pattern[k]{
return false
}
}
return true
}
复杂度
时间复杂度: O ( m n ) O(mn) O(mn) ,m和n分别为word,pattern长度。
空间复杂度: O ( m ) O(m) O(m),哈希表空间。
总结
好久没做题了。。拿到offer后摸鱼了挺久。。