边工作边刷题:70天一遍leetcode: day 21-2
Word Search
要点:题目不难,但是dfs有很多要素,可以有很多方式组织实现,关键是如何固定实现从而使code的错误最小。
- visited要在dfs函数开头set,而在函数结尾reset。同理,当前字符的匹配也在开始
- 这样看出规律,都是在函数内检查pass-in参数的状况,这样是最精简的code
- 一般True的结束条件是超过边界,但是这题的特殊在于,如果超过border是不进一步dfs的,所以没机会返回True。因此,要在最后一个字符匹配后返回True。同样如果所有dfs都fail掉最终返回False
错误点:
- word的index和board的index是分开的,起始点word总是0,而board是i,j循环变量
- 如果用1d index,算法会很慢
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
def helper(board, i, j, start, word):
if word[start]!=board[i][j]:
return False
if start==len(word)-1:
return True
#print i,j
c = board[i][j]
board[i][j]='.'
m = len(board)
n = len(board[0])
if i+1<m and helper(board, i+1, j, start+1, word):
return True
if i-1>=0 and helper(board, i-1, j, start+1, word):
return True
if j+1<n and helper(board, i, j+1, start+1, word):
return True
if j-1>=0 and helper(board, i, j-1, start+1, word):
return True
board[i][j]=c
return False
m = len(board)
n = len(board[0])
for i in range(m):
for j in range(n):
if board[i][j]==word[0]:
if helper(board, i, j, 0, word):
return True
return False