Leetcode--BFS

2017-03-09  本文已影响0人  Morphiaaa

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

上一篇下一篇

猜你喜欢

热点阅读