Leetcode--BFS

130. Surrounded Regions

可以分为三个步骤

  1. 初始化一个list或dequequeue = collections.deque([]),遍历矩阵,将所有位于矩阵边缘上的O的坐标存起来
for i in range(m):
      for j in range(n):
           if (i in [0, m-1] or j in [0, n-1]) and board[i][j] == 'O':
               queue.append((i, j))
  1. 遍历queue中的元素坐标,将每个等于O的元素的上下左右邻居坐标都存入queue中,如果i,j满足条件,且元素等于'O', 就先将其设为'S'
while queue:
         i, j = queue.popleft()
         if m > i >=0  and n > j >= 0 and board[i][j] == 'O':
                board[i][j] = 'S'
         queue.append((i-1,j));  queue.append((i+1, j)); 
         queue.append(i, j-1); queue.append((i, j+1))

将上下左右邻居都加进去做检查的原因是,有可能O没有被X围住,这时我们就要保留O在原位置上。特殊情况有:[OOO, OOO,OOO]

  1. 再次遍历数组,将元素为'O'的,赋值为'X',将元素为'S'的,还原成'O'
for i in range(m):
     for j in range(n):
          if board[i][j] == 'O':
             board[i][j] = 'X'
          elif board[i][j] == 'S':
             board[i][j] = 'O'

127. Word Ladder

先将endword放入wordlist里去,然后初始化一个元素为list类型的deque,先将startword和length = 1放进去,当queue不为空时,就pop出当前的第一个word
wordlist.append(endword) queue = collections.deque([]) queue.append([startword, 1])

while queue:
          word, length = queue.popleft()
          if word == endword:
               return length
          for i in range(len(word)):
               for j in 'abcdefghijklmnopqrstuvwxyz':
                    if word[i] != j:
                       nextword = word[:i] + j + word[i+1:]
                       if nextword in wordlist:
                            wordlist.remove(nextword)
                            queue.append([nextword, length+1])

每次pop出来一个单词后,通过BFS来构造与它只差一个字母的newword,如果newword存在wordlist里,就证明这个就是我们要找的下一个单词,先将它从wordlist里删除,避免重复访问,然后再将它append到queue里,以便进行下一步查找,并且length要加1. 最后如果得不到endword,就返回0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容