Leetcode--BFS
2017-03-09 本文已影响0人
Morphiaaa
130. Surrounded Regions
可以分为三个步骤
- 初始化一个list或deque
queue = 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))
- 遍历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]
- 再次遍历数组,将元素为'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