題目描述
你有一個單詞列表 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 映射到同一個字母。
算法思路
class Solution:
def findAndReplacePattern(self, words: List[str], pattern: str) -> List[str]:
d={}
# 原理上就是把單詞abb,bcc,cdd等都變成011格式
# 把abc,dsx等變成012格式
# 然後把相同格式的單詞通過格式放到相同的組裏即可。
for i in words:
s=''
dd={}
n=0
for ii in i:
if ii not in dd:
dd[ii]=str(n)
n+=1
s+=dd[ii]
if s not in d:
d[s]=[]
d[s].append(i)
s,dd,n='',{},0
for ii in pattern:
if ii not in dd:
dd[ii]=str(n)
n+=1
s+=dd[ii]
return d.get(s,[])
執行用時 :28 ms, 在所有 Python3 提交中擊敗了99.41%的用戶
內存消耗 :13.7 MB, 在所有 Python3 提交中擊敗了100.00%的用戶
優化:
class Solution:
def findAndReplacePattern(self, words: List[str], pattern: str) -> List[str]:
def hp(i):
s,dd,n='',{},0
for ii in i:
if ii not in dd:
dd[ii]=str(n)
n+=1
s+=dd[ii]
return s
d={}
for i in words:
s=hp(i)
if s not in d:d[s]=[]
d[s].append(i)
return d.get(hp(pattern),[])