タイトル
単語がグリッドに存在する場合、2Dボードや単語を考えると、見つけます。
単語は「隣接」セルが水平方向または垂直方向に隣接するもので順次隣接するセルの文字から構成することができます。同じ文字セルは、複数回使用することはできません。
例:
ボード= [ [ 'A'、 'B'、 'C'、 'E']、 [ 'S'、 'F'、 'C'、 'S']、 [ 'A'、 'D'、E ' 」、 'E'] ] 単語を考える= " ABCCED "、返す真。 単語=「考えるSEE」、返す真。 与えられた単語= " ABCB "、リターンはfalse。
思考
バックトラック付き。ただ比較された文字板を取ると、そのボードをコピーしませんが、直接ボードの値を変更します(セルがアップに使用されていることを示します)のでどこにもあれば、その後の回復の値を変更します。
def existSub(self,board,word,i,j):
if len(word) == 0:
return True
c = word[0:1]
temp = board[i][j]
board[i][j] = ""
option_i = [-1,1]
if i == 0:
option_i.remove(-1)
if i==len(board)-1:
option_i.remove(1)
option_j = [-1,1]
if j == 0:
option_j.remove(-1)
if j == len(board[0])-1:
option_j.remove(1)
for k in option_i:
if c == board[i+k][j]:
if self.existSub(board,word[1:],i+k,j):
return True
for k in option_j:
if c == board[i][j+k]:
if self.existSub(board,word[1:],i,j+k):
return True
board[i][j] = temp
return False
def exist(self, board: List[List[str]], word: str) -> bool:
if len(board)==0:
return False
c_start = word[0:1]
m,n = len(board),len(board[0])
for i in range(m):
for j in range(n):
if board[i][j] == c_start:
if self.existSub(board,word[1:],i,j):
return True
return False