MiaoRain / Algorithm_leetcode

0 stars 1 forks source link

LeetCode-dfs&bfs #18

Open MiaoRain opened 4 years ago

MiaoRain commented 4 years ago

image

class Solution:
    def minMutation(self, start: str, end: str, bank: List[str]) -> int:
        queue =  []
        queue.append((start, 0))
        bankSet = set(bank)

        while queue:
            curr, step = queue.pop(0)
            if curr == end:
                return step
            for i in range(len(curr)):
                for c in "AGCT":
                    mutation = curr[:i] + c + curr[i+1:]
                    if mutation in bankSet:
                        bankSet.remove(mutation)
                        queue.append((mutation, step+1))

        return -1
MiaoRain commented 4 years ago

image

class Solution:
    def largestValues(self, root: TreeNode) -> List[int]:
        ans = []
        if root is None:
            return ans
        queue = [root]

        while queue:
            ans.append(max(x.val for x in queue))
            new_queue = []
            for node in queue:
                if node.left:
                    new_queue.append(node.left)
                if node.right:
                    new_queue.append(node.right)
            queue = new_queue
        return ans
MiaoRain commented 4 years ago

image image

from collections import defaultdict
class Solution:
    def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
        """
        defaultdict与普通dict的最大作用在于:
你可以直接call一个不存在的key, 如果不存在这个key,那就先直接创建这个key,并根据默认值的设置,赋值value,而后在继续操作。
省去了
dict[new] = dict.get(new, default = [])
然后才能使用dict[new]来进一步操作。
相比之下:你可放心大胆的用:defaultdict[new] 管他有没有。

        """
        if endWord not in wordList or not endWord or not beginWord or not wordList:
            return 0
        L = len(beginWord)
        all_combo_dict = defaultdict(list)
        for word in wordList:
            for i in range(len(beginWord)):
                # Key is the generic word
                # Value is a list of words which have the same intermediate generic word.
                all_combo_dict[word[:i] + "*" + word[i+1:]].append(word)
        #print(all_combo_dict)
        queue = [(beginWord, 1)]
        print(queue)
        visited = {beginWord: True} 
        while queue:
            current_word, level = queue.pop(0)
            for i in range(L):
                intermediate_word = current_word[:i] + "*" + current_word[i+1:]

                for word in all_combo_dict[intermediate_word]:
                    if word == endWord:
                        return level + 1
                    if word not in visited:
                        visited[word] = True
                        queue.append((word, level + 1))
                all_combo_dict[intermediate_word] = []
        return 0
MiaoRain commented 4 years ago

image

class Solution:
    def dfs(self, grid, r, c):
        grid[r][c] = 0
        nr, nc = len(grid), len(grid[0])
        for x, y in [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]:
            if 0 <= x < nr and 0 <= y < nc and grid[x][y] == "1":
                self.dfs(grid, x, y)

    def numIslands(self, grid: List[List[str]]) -> int:
        nr = len(grid)
        if nr == 0:
            return 0
        nc = len(grid[0])

        num_islands = 0
        for r in range(nr):
            for c in range(nc):
                if grid[r][c] == "1":
                    num_islands += 1
                    self.dfs(grid, r, c)

        return num_islands