class Solution(object):
def checkDirection(self, w, h, board, ch, directions, direction, searchpath, pathmark):
i,j,_=searchpath[-1]
pathmark.add((i,j))
for ind,dd in enumerate(directions[direction:], direction+1):
di,dj=dd
if i+di>=0 and i+di<w and j+dj>=0 and j+dj<h \
and (i+di,j+dj) not in pathmark and board[j+dj][i+di]==ch:
searchpath.append((i+di,j+dj,ind))
pathmark.add((i+di,j+dj))
return 0
pathmark.remove((i,j))
return -1
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
if len(word)==0: return True
h=len(board)
if h==0: return False
w=len(board[0])
wmap=[]
for i in xrange(w):
for j in xrange(h):
if board[j][i]==word[0]:
wmap.append([(i,j,0),])
for searchpath in wmap:
ind=1
pathmark=set()
direction=0
while ind < len(word):
direction=self.checkDirection(w, h, board, word[ind], [(-1,0),(0,-1),(1,0),(0,1),], direction, searchpath, pathmark)
if direction<0:
ind-=1
if ind<=0:
break
_,_,direction=searchpath[-1]
del searchpath[-1]
else:
ind+=1
if ind==len(word): return True
return False
# nextwmap=[]
# for searchpath in wmap:
# i,j=searchpath[-1]
# if i>0 and (i-1,j) not in searchpath and board[j][i-1]==word[ind]:
# newpath=searchpath[:]
# newpath.append((i-1,j))
# nextwmap.append(newpath)
# if j>0 and (i,j-1) not in searchpath and board[j-1][i]==word[ind]:
# newpath=searchpath[:]
# newpath.append((i,j-1))
# nextwmap.append(newpath)
# if i<w-1 and (i+1,j) not in searchpath and board[j][i+1]==word[ind]:
# newpath=searchpath[:]
# newpath.append((i+1,j))
# nextwmap.append(newpath)
# if j<h-1 and (i,j+1) not in searchpath and board[j+1][i]==word[ind]:
# newpath=searchpath[:]
# newpath.append((i,j+1))
# nextwmap.append(newpath)
# wmap=nextwmap
return len(wmap)>0