<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)79:?jiǎn)卧~搜索

          共 3366字,需瀏覽 7分鐘

           ·

          2020-10-28 08:00

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做?單詞搜索,我們先來(lái)看題面:

          https://leetcode-cn.com/problems/word-search/

          Given a 2D board and a word, find if the word exists in the grid.


          The word can be constructed from letters of sequentially adjacent cells, where "adjacent" cells are horizontally or vertically neighboring. The same letter cell may not be used more than once.

          題意

          給定一個(gè)二維網(wǎng)格和一個(gè)單詞,找出該單詞是否存在于網(wǎng)格中。
          單詞必須按照字母順序,通過(guò)相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個(gè)單元格內(nèi)的字母不允許被重復(fù)使用。

          樣例

          board?=
          [
          ??['A','B','C','E'],
          ??['S','F','C','S'],
          ??['A','D','E','E']
          ]

          給定 word = "ABCCED", 返回 true
          給定 word = "SEE", 返回 true
          給定 word = "ABCB", 返回 false


          比如第一個(gè)字符串ABCCED,我們可以在數(shù)組當(dāng)中找到這樣一條路徑:

          解題

          https://www.cnblogs.com/techflow/p/13180855.html

          題解

          如果你刷過(guò)許多題,經(jīng)常思考的話,我想應(yīng)該不難發(fā)現(xiàn),這道題的本質(zhì)其實(shí)和走迷宮問(wèn)題是一樣的。
          我們拿到的這個(gè)二維的字符型數(shù)組就是一個(gè)迷宮, 我們是要在這個(gè)迷宮當(dāng)中找一條“出路”。不過(guò)我們的目的不是找到終點(diǎn),而是找到一條符合題意的路徑。在走迷宮問(wèn)題當(dāng)中,迷宮中不是每一個(gè)點(diǎn)都可以走的,同樣在當(dāng)前問(wèn)題當(dāng)中,也不是每一個(gè)點(diǎn)都符合字符串的要求的。這兩個(gè)問(wèn)題雖然題面看起來(lái)大相徑庭,但是核心的本質(zhì)是一樣的。
          我們來(lái)回憶一下,走迷宮問(wèn)題應(yīng)該怎么解決?
          這個(gè)答案應(yīng)該已經(jīng)非常確定了,當(dāng)然是搜索算法。我們需要搜索解可能存在的空間去尋找存在的解,也就是說(shuō)我們面臨的是一個(gè)解是否存在的問(wèn)題,要么找到解,要么遍歷完所有的可能性發(fā)現(xiàn)解不存在。確定了是搜索算法之后,剩下的就簡(jiǎn)單了,我們只有兩個(gè)選項(xiàng),深度優(yōu)先或者是廣度優(yōu)先。
          理論上來(lái)說(shuō),一般判斷解的存在性問(wèn)題,我們使用廣度優(yōu)先搜索更多,因?yàn)橐话銇?lái)說(shuō)它可以更快地找到解。但是本題當(dāng)中有一個(gè)小問(wèn)題是,廣度優(yōu)先搜索需要在隊(duì)列當(dāng)中存儲(chǔ)中間狀態(tài),需要記錄地圖上行走過(guò)的信息,每有一個(gè)狀態(tài)就需要存儲(chǔ)一份地圖信息,這會(huì)帶來(lái)比較大的內(nèi)存開(kāi)銷(xiāo),同樣存儲(chǔ)的過(guò)程也會(huì)帶來(lái)計(jì)算開(kāi)銷(xiāo),在這道題當(dāng)中,這是不可以接受的。拷貝狀態(tài)帶來(lái)的空間消耗還是小事,關(guān)鍵是拷貝帶來(lái)的時(shí)間開(kāi)銷(xiāo),就足夠讓這題超時(shí)了。所以我們別無(wú)選擇,只能深度優(yōu)先。
          明確了算法之后,只剩下了最后一個(gè)問(wèn)題,在這個(gè)走迷宮問(wèn)題當(dāng)中,我們?cè)趺凑业矫詫m的入口呢?因?yàn)轭}目當(dāng)中并沒(méi)有規(guī)定我們起始點(diǎn)的位置,這也不難解決,我們遍歷二維的字符數(shù)組,和字符串開(kāi)頭相匹配的位置都可以作為迷宮的入口。
          最后,我們來(lái)看代碼,并沒(méi)有什么技術(shù)含量,只是簡(jiǎn)單的回溯法而已。

          class?Solution:
          ????def?exist(self, board: List[List[str]], word: str)?-> bool:
          ????????fx = [[0, 1], [0, -1], [1, 0], [-1, 0]]
          ????????def?dfs(x, y, l):
          ????????????if?l == len(word):
          ????????????????return?True
          ????????????for?i in?range(4):
          ????????????????nx = x + fx[i][0]
          ????????????????ny = y + fx[i][1]
          ????????????????# 出界或者是走過(guò)的時(shí)候,跳過(guò)
          ????????????????if?nx < 0?or?nx == n or?ny < 0?or?ny == m or?visited[nx][ny]:
          ????????????????????continue
          ????????????????if?board[nx][ny] == word[l]:
          ????????????????????visited[nx][ny] = 1
          ????????????????????if?dfs(nx, ny, l+1):
          ????????????????????????return?True
          ????????????????????visited[nx][ny] = 0
          ????????????return?False
          ????????????????
          ????????n = len(board)
          ????????if?n == 0:
          ????????????return?False
          ????????m = len(board[0])
          ????????if?m == 0:
          ????????????return?False
          ????????
          ????????visited = [[0?for?i in?range(m)] for?j in?range(n)]
          ????????
          ????????for?i in?range(n):
          ????????????for?j in?range(m):
          ????????????????# 找到合法的起點(diǎn)
          ????????????????if?board[i][j] == word[0]:
          ????????????????????visited = [[0?for?_ in?range(m)] for?_ in?range(n)]
          ????????????????????visited[i][j] = 1
          ????????????????????if?dfs(i, j, 1):
          ????????????????????????return?True
          ????????????????????
          ????????return?False

          總結(jié)

          如果能夠想通回溯法,并且對(duì)于回溯法的實(shí)現(xiàn)足夠熟悉,那么這題的難度是不大的。實(shí)際上至今為止,我們一路刷來(lái),已經(jīng)做了好幾道回溯法的問(wèn)題了,我想對(duì)你們來(lái)說(shuō),回溯法的問(wèn)題應(yīng)該已經(jīng)小菜一碟了。
          相比于回溯法來(lái)說(shuō),我覺(jué)得更重要的是我們能夠通過(guò)分析想清楚,為什么廣度優(yōu)先搜索不行,底層核心的本質(zhì)原因是什么。這個(gè)思考的過(guò)程往往比最后的結(jié)論來(lái)得重要。
          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。


          上期推文:

          LeetCode40-60題匯總,速度收藏!
          LeetCode刷題實(shí)戰(zhàn)61:旋轉(zhuǎn)鏈表
          LeetCode刷題實(shí)戰(zhàn)62:不同路徑
          LeetCode刷題實(shí)戰(zhàn)63:不同路徑 II
          LeetCode刷題實(shí)戰(zhàn)64:最小路徑和
          LeetCode刷題實(shí)戰(zhàn)66:加一
          LeetCode刷題實(shí)戰(zhàn)67:二進(jìn)制求和
          LeetCode刷題實(shí)戰(zhàn)68:文本左右對(duì)齊
          LeetCode刷題實(shí)戰(zhàn)69:x 的平方根
          LeetCode刷題實(shí)戰(zhàn)70:爬樓梯
          LeetCode刷題實(shí)戰(zhàn)71:簡(jiǎn)化路徑
          LeetCode刷題實(shí)戰(zhàn)72:編輯距離
          LeetCode刷題實(shí)戰(zhàn)73:矩陣置零
          LeetCode刷題實(shí)戰(zhàn)74:搜索二維矩陣
          LeetCode刷題實(shí)戰(zhàn)75:顏色分類
          LeetCode刷題實(shí)戰(zhàn)76:最小覆蓋子串
          LeetCode刷題實(shí)戰(zhàn)77:組合
          LeetCode刷題實(shí)戰(zhàn)78:子集

          瀏覽 68
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费无码毛片一区二区本码视频 | 麻豆久久久电影网 | 自拍偷拍精品 | 午夜网站你懂的 | 亚洲色噜噜噜 |