【剑斩OFFER】算法的暴力美学——力扣 433 题:最小基因变化

一、题目描述

二、算法原理

思路: BFS算法 + 哈希表快速查找

我们可以发现这起始就是边权为 1 的最短路径问题:

https://blog.csdn.net/2403_84958571/article/details/157183596?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

我们要创建两个哈希表,一个用来存储以往入队列的字符串,防止我们枚举的合法的字符串再次入队列,另外一个存储基因库,用来快速查找我们枚举的字符串是否是合法的;

怎么把当前的字符串枚举出合法(即:属于基于库、不属于过往的入队列的字符串),使用两个for循环,每次固定一个字符,把 A'、'C'、'G' 和 'T' 枚举进去,此时就能实现枚举出来;

三、代码实现

cpp 复制代码
class Solution {
    string target;
    int ret;
    unordered_set<string> hash_b;//基因库
public:
    int minMutation(string startGene, string endGene, vector<string>& bank) {
        target = "ACGT";
        for(auto& e : bank)//便于后续快速找到当前字符串是否在 bank 中
        {
            hash_b.insert(e);
        }

        queue<string> que;
        ret = 0;
        unordered_map<string,bool> hash_str;//防止以往的序列入 hash_str
        hash_str[startGene] = true;
        que.push(startGene);
        while(que.size())
        {
            int flor = que.size();//剥离的次数
            ret++;//剥离的层数
            while(flor--)
            {
                string str = que.front();
                que.pop();
                if(Check(str,endGene,hash_str,que)) return ret;
            }
        }
        return -1;
    }

    bool Check(string& str,string& end,unordered_map<string,bool>& hash_str,queue<string>& que)
    {
        for(int i = 0; i < str.size(); i++)
        {
            for(int j = 0; j < target.size(); j++)//枚举可能组合的序列
            {
                char ch = str[i];
                str[i] = target[j];
                if(hash_b.count(str) && !hash_str.count(str))
                {
                    if(str == end) return true;
                    hash_str[str] = true;
                    que.push(str);
                }
                str[i] = ch;
            }
        }
        return false;
    }
};
相关推荐
江屿风8 分钟前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法
nebula-AI10 分钟前
人工智能导论:模型与算法(核心技术)
人工智能·深度学习·神经网络·算法·机器学习·集成学习·sklearn
运筹vivo@28 分钟前
LeetCode 2405. 子字符串的最优划分
c++·算法·leetcode·职场和发展·哈希表
数智工坊29 分钟前
视觉-语言-动作模型解剖学:从模块、里程碑到核心挑战
论文阅读·人工智能·深度学习·算法·transformer
yuannl1039 分钟前
数据结构----二叉排序树(ai修改版)
数据结构
有点。1 小时前
C++(枚举法一练习题)
开发语言·c++·算法
basketball6161 小时前
C++ 单例模式完全指南:从饿汉式到现代 C++ 的最佳实践
java·c++·单例模式
黎阳之光1 小时前
视听融合新范式!黎阳之光打破视觉边界,声影协同赋能全域智慧管控
大数据·人工智能·物联网·算法·数字孪生
iiiiyu1 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
小江的记录本1 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程