leetcode-単語検索

 単語検索


2次元グリッドと単語が与えられた場合、その単語がグリッドに存在するかどうかを調べます。

単語はアルファベット順で、隣接するセルの文字で形成されている必要があります。「隣接する」セルは、水平方向または垂直方向に隣接するセルです。同じセル内の文字は再利用できません。

例:

ボード=
[
  ['A'、 'B'、 'C​​'、 'E']、
  ['S'、 'F'、 'C​​'、 'S']、
  ['A'、 'D'、 'E '、' E ']
]]

与えられた単語= "ABCCED"、真を返す
与えられた単語= "SEE"、真を返す
与えられた単語= "ABCB"、偽を返す

促す:

ボードと単語には大文字と小文字の英字のみが含まれています。
1 <= board.length <= 200
1 <= board [i] .length <= 200
1 <= word.length <= 10 ^ 3
合格108,459提出249,098

 

コード

class Solution:
    def equal_c(self, board, mark, c, row, col):
        if row >= len(board) or row < 0:
            return False
        if col >= len(board[row]) or col < 0:
            return False
        if mark[row][col] == 0 and board[row][col]==c:
            return True
        return False

    def exist(self, board, word):
        word_clist = list(word)
        for row in range(len(board)):
            for col in range(len(board[row])):
                if word_clist[0]!=board[row][col]:
                    continue
                if len(word_clist)==1:
                    return True
                mark = [[0] * len(item) for item in board] # 用来标记是否已经选中
                choose_list = [''] * len(word_clist)
                cur_word_i = 0
                choose_list[0] = (row, col)
                mark[row][col] = 1
                cur_word_i += 1
                temp_store = [[] for i in range(len(word_clist))] # 暂存每一位未遍历的点
                temp_store[cur_word_i].extend([(row, col+1),(row+1, col),(row, col-1),(row-1, col)])
                while cur_word_i > 0:
                    if len(temp_store[cur_word_i])==0:
                        cur_word_i -= 1
                        pre_pos = choose_list[cur_word_i]
                        mark[pre_pos[0]][pre_pos[1]] = 0
                        choose_list[cur_word_i] = ''
                        continue
                    pos = temp_store[cur_word_i][0]
                    temp_store[cur_word_i].remove(pos)
                    if self.equal_c(board, mark, word_clist[cur_word_i], pos[0], pos[1]): #匹配上,进行下一位置搜索
                        if cur_word_i == len(word_clist) - 1:
                            return True
                        choose_list[cur_word_i] = pos
                        mark[pos[0]][pos[1]] = 1
                        cur_word_i += 1
                        temp_store[cur_word_i].extend([(pos[0], pos[1]+1),(pos[0]+1, pos[1]),(pos[0], pos[1]-1),
                                                       (pos[0]-1, pos[1])])
        return False

 

おすすめ

転載: blog.csdn.net/katrina1rani/article/details/108715985