2022跟着leedcode学数据结构--第25天

115 阅读1分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

image.png

单词接龙

字典 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

执行结果:

image.png

岛屿数量

给你一个由 '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

执行结果:

image.png