leetcode:79単語検索をバックトラック

タイトル

単語がグリッドに存在する場合、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

 

公開された45元の記事 ウォンの賞賛1 ビュー3359

おすすめ

転載: blog.csdn.net/qq_22498427/article/details/104568461