iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
自我挑戰組

每天早起刷一題系列 第 7

[7/30][Med] Word Search

  • 分享至 

  • xImage
  •  

起床時間:0900
睡太晚,女生月常。我剛剛按到右上鐵人發文,整文章不見

題目

給一個 2D 字元網格 board 與字串 word,判斷是否能在網格中用「上下左右相鄰」的路徑拼出 word。同一格不能重複使用。

直覺思路

寫了一半,感覺好像可以寫出暴力解 for迴圈遍歷整個board 找到目標字就進入檢查function 檢查function要獨立寫出來 這題應該是遞迴?

class Solution: def exist(self, board: List[List[str]], word: str) -> bool: word_idx = 0 while(word_idx < len(world)){ for row in board: for val in row: if val is word[word_idx]: check() if check is true: word_idx += 1 check() } def check(cur: List[int], target: str) -> bool:

盲點

整體想法「遍歷整個 board,遇到首字母就進入檢查 function,並用遞迴檢查四個方向」就是這題的典型做法(Backtracking/DFS)
但。

  • 不要用 word_idx 在外層 while 逐一推進
    • 正確做法是:對每個格子 (r, c),如果 board[r][c] == word[0],就呼叫 check(r, c, 0)。
    • check(或叫 dfs)用參數 k 代表目前要比對 word[k],成功條件是 k == len(word)。
  • 字元比較用 ==,不要用 is
    • is 比的是「同一物件」,不是字面值相等。要用 ==。
  • Python 語法 天啊我超弱
    • Python 沒有 {} 區塊;用縮排。
    • while (...) { ... } 這種 C/Java 風格在 Python 不行。
    • if check is true: 也不對;應該是 if check(...):。
  • 需要避免重複使用同一格
    • 方法 A:用 visited 陣列紀錄當前路徑走過的格子。
    • 方法 B:在遞迴中「就地標記」該格(比如暫存起來後設為特殊符號),回溯時再還原。
  • 四個方向搜尋
    • 往上、下、左、右遞迴;遇到不合法(越界/不相等/已用過)就回傳 False。
  • 提早返回
    • 一旦某條路徑找到整個字,立刻往上層回傳 True,整體就可結束。

官方暴力解研讀

還沒看


上一篇
[6/30][Hard] Minimum Window Substring
系列文
每天早起刷一題7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言