【力扣】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 映射到同一個字母。

算法思路

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),[])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章