leetcode(34)-單詞搜尋
阿新 • • 發佈:2020-09-15
給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。
示例:
board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]
給定 word = "ABCCED", 返回 true
給定 word = "SEE", 返回 true
給定 word = "ABCB", 返回 false
來源:力扣(LeetCode)
連結: https://leetcode-cn.com/problems/word-search
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
應該dfs寫了個BFS,毛病。deepcopy佔用很多時間。
trick
ans = [] for b in board: ans += b need = Counter(word) ans = Counter(ans) for k, v in need.items(): if v > ans[k]: return False
import copy from collections import defaultdict class Solution: def exist(self, board, word: str) -> bool: m = len(board) n = len(board[0]) stack = [] flags = set([]) for i in range(m): for j in range(n): if board[i][j] == word[0]: t = copy.deepcopy(flags) t.add((i,j)) stack.append((t,(i,j),1)) while len(stack)>0: #print(stack) top = stack[-1] stack = stack[:-1] t, (i,j), k = top if k>=len(word): return True for p, q in [(0,1),(0,-1),(1,0),(-1,0)]: if 0<=i+p<m and 0<=j+q<n and (i+p,j+q) not in t and word[k]==board[i+p][j+q]: new_t = copy.deepcopy(t) new_t.add((i+p,j+q)) stack.append((new_t,(i+p,j+q),k+1)) return False