LeetCode 212 [Word Search II]

原題

給出一個(gè)由小寫字母組成的矩陣和一個(gè)字典辅搬。找出所有同時(shí)在字典和矩陣中出現(xiàn)的單詞唯沮。一個(gè)單詞可以從矩陣中的任意位置開始,可以向左/右/上/下四個(gè)相鄰方向移動(dòng)。

樣例
給出矩陣:
doaf
agai
dcan
和字典:
{"dog", "dad", "dgdg", "can", "again"}
返回 {"dog", "dad", "can", "again"}

解題思路

  • 最直接但是會(huì)超時(shí)的方法 - 先把字典做成hashMap介蛉,對(duì)每一個(gè)點(diǎn)DFS萌庆,每增加一個(gè)字符就去hashMap查找是否存在。一共m*n個(gè)點(diǎn)币旧,每次DFS復(fù)雜度是O(m*n)践险,所以總的時(shí)間復(fù)雜度是O(m*n * m*n)
  • 可行解 - 把給出的字典變成Trie樹,Trie樹可以檢查前綴吹菱,hashMap做不到巍虫。檢查前綴的時(shí)候,如果發(fā)現(xiàn)某個(gè)前綴不存在鳍刷,就可以不用繼續(xù)DFS了占遥,相當(dāng)于剪枝
  • 注意:當(dāng)不必要的check增多時(shí),會(huì)導(dǎo)致TLE
# 超時(shí)
if x < 0 or x >= len(board) or y < 0 or y >= len(board[0]) or board[x][y] == 0 or cur_node == None:
# 免去兩個(gè)不必要的check倾剿,不超時(shí)
if x < 0 or x >= len(board) or y < 0 or y >= len(board[0]):

完整代碼

class TrieNode(object):
    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.children = {}
        self.IsWord = False
        

class Trie(object):
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        """
        Inserts a word into the trie.
        :type word: str
        :rtype: void
        """
        node = self.root
        for letter in word:
            child = node.children.get(letter)
            if child is None:
                child = TrieNode()
                node.children[letter] = child
            node = child
        node.IsWord = True
        
class Solution(object):
    def __init__(self):
        self.result = []
    def findWords(self, board, words):
        """
        :type board: List[List[str]]
        :type words: List[str]
        :rtype: List[str]
        """
        trie = Trie()
        for word in words:
            trie.insert(word)
        
        for row_num in range(len(board)):
            for col_num in range(len(board[0])):
                self.search(board, row_num, col_num, trie.root, "")
                
        return self.result
                
    def search(self, board, x, y, cur_node, word):
        if cur_node.IsWord:
            self.result.append(word)
            cur_node.IsWord = False
        
        if not (x < 0 or x >= len(board) or y < 0 or y >= len(board[0])):
            temp = board[x][y]
            cur_node = cur_node.children.get(temp)
            if cur_node:
                board[x][y] = "#"
                self.search(board, x+1, y, cur_node, word+temp)
                self.search(board, x-1, y, cur_node, word+temp)
                self.search(board, x, y+1, cur_node, word+temp)
                self.search(board, x, y-1, cur_node, word+temp)
                board[x][y] = temp
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蚌成,隨后出現(xiàn)的幾起案子前痘,更是在濱河造成了極大的恐慌,老刑警劉巖担忧,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芹缔,死亡現(xiàn)場離奇詭異,居然都是意外死亡瓶盛,警方通過查閱死者的電腦和手機(jī)最欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惩猫,“玉大人芝硬,你說我怎么就攤上這事≡浚” “怎么了拌阴?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奶镶。 經(jīng)常有香客問我迟赃,道長,這世上最難降的妖魔是什么厂镇? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任纤壁,我火速辦了婚禮,結(jié)果婚禮上捺信,老公的妹妹穿的比我還像新娘酌媒。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布馍佑。 她就那樣靜靜地躺著斋否,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拭荤。 梳的紋絲不亂的頭發(fā)上茵臭,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音舅世,去河邊找鬼旦委。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雏亚,可吹牛的內(nèi)容都是我干的缨硝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼罢低,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼查辩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起网持,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤宜岛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后功舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萍倡,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年辟汰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了列敲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帖汞,死狀恐怖戴而,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翩蘸,我是刑警寧澤填硕,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鹿鳖,受9級(jí)特大地震影響扁眯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翅帜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一姻檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涝滴,春花似錦绣版、人聲如沸胶台。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈唬。三九已至,卻和暖如春缩麸,著一層夾襖步出監(jiān)牢的瞬間铸磅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工杭朱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阅仔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓弧械,卻偏偏與公主長得像八酒,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刃唐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容