「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」
单词接龙
字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk:
- 每一对相邻的单词只差一个字母。
- 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
- sk == endWord
- 给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。
示例 1:
-
输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
-
输出:5
-
解释:一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的长度 5。
-
示例 2:
-
输入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
-
输出:0
-
解释:endWord "cog" 不在字典中,所以无法进行转换。
提示:
- 1 <= beginWord.length <= 10
- endWord.length == beginWord.length
- 1 <= wordList.length <= 5000
- wordList[i].length == beginWord.length
- beginWord、endWord 和 wordList[i] 由小写英文字母组成
- beginWord != endWord
- wordList 中的所有字符串 互不相同 相关标签
- 广度优先搜索
- 哈希表
- 字符串
解题思路:
- 先判断 endWord 是否包含在wordList 如果不在则直接返回 0
- 将wordList 转化为 集合 去除重复值,方便判断
- 调用queue 队列方法 将endWord 放入队列中
- 开始BFS 广度优先搜索
- 依次弹出队列中的单词 进行搜索 执行
class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
if endWord not in wordList:
return 0
s_word = set(wordList)
queue=collections.deque()
queue.append((beginWord,1))
tmp=set()
tmp.add(beginWord)
m=len(beginWord)
while queue:
start,end=queue.popleft()
if start==endWord:
return end
for i in range(m):
for j in range(26):
arr=cur[:i]+start(97+j)+cur[i+1:]
if arr not in tmp and arr in s_word:
queue.append((arr,end+1))
tmp.add(arr)
return 0
执行结果:
岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"] ] 输出:1 示例 2:
输入:grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ] 输出:3
提示:
m == grid.length n == grid[i].length 1 <= m, n <= 300 grid[i][j] 的值为 '0' 或 '1' 相关标签
- 深度优先搜索
- 广度优先搜索
- 并查集
- 数组
- 矩阵
解题思路:
- 上来第一件事,还是判断特殊情况,不存在,直接返回0
- 典型的 深度优先搜索 使用DFS 方法进行判断
- 遍历grid 和grid[i] 判断使用深度优先算法进行递归
- 最后获取到的tmp值就是我们要的值
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
if not grid : return 0
def dfs(m,n):
grid[m][n] = '0'
for x, y in [[1,0],[0,1],[-1,0],[0,-1]]:
tmp_i = m + x
tmp_j = n + y
if 0<=tmp_i<end and 0<= tmp_j<start and grid[tmp_i][tmp_j] == '1':
dfs(tmp_i,tmp_j)
return
start = len(grid)
end = len(grid[0])
tmp = 0
for i in range(start):
for j in range(end):
if grid[i][j] == '1':
dfs(i,j)
tmp+=1
return tmp
执行结果: