433. 最小基因变化

exiaohu 于 2022-05-07 发布

题目链接:433. 最小基因变化

广度优先搜索,搜索所有可能出现的变化。

from typing import List, Set


class Solution:
    def minMutation(self, start: str, end: str, bank: List[str]) -> int:
        def mutate(gene: str) -> Set[str]:
            ret = set()
            for i in range(len(gene)):
                ret = ret.union([
                    gene[:i] + 'A' + gene[i + 1:],
                    gene[:i] + 'C' + gene[i + 1:],
                    gene[:i] + 'G' + gene[i + 1:],
                    gene[:i] + 'T' + gene[i + 1:],
                ])
            ret.remove(gene)
            return ret

        bank = set(bank)
        if end not in bank:
            return -1

        if start == end:
            return 0

        visited, s0, ans = {start}, {start}, 0
        while s0:
            s1 = set()
            ans += 1
            for item in s0:
                s1 = s1.union(mutate(item))

            if end in s1:
                return ans

            s0 = s1.intersection(bank).difference(visited)
            visited = visited.union(s0)

        return -1