1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ?LeetCode刷題實(shí)戰(zhàn)433:最小基因變化

        共 2587字,需瀏覽 6分鐘

         ·

        2021-11-09 14:49

        算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

        今天和大家聊的問(wèn)題叫做?最小基因變化,我們先來(lái)看題面:
        https://leetcode-cn.com/problems/minimum-genetic-mutation/


        一條基因序列由一個(gè)帶有8個(gè)字符的字符串表示,其中每個(gè)字符都屬于 "A", "C", "G", "T"中的任意一個(gè)。
        假設(shè)我們要調(diào)查一個(gè)基因序列的變化。一次基因變化意味著這個(gè)基因序列中的一個(gè)字符發(fā)生了變化。
        例如,基因序列由"AACCGGTT" 變化至 "AACCGGTA" 即發(fā)生了一次基因變化。
        與此同時(shí),每一次基因變化的結(jié)果,都需要是一個(gè)合法的基因串,即該結(jié)果屬于一個(gè)基因庫(kù)。
        現(xiàn)在給定3個(gè)參數(shù) — start, end, bank,分別代表起始基因序列,目標(biāo)基因序列及基因庫(kù),請(qǐng)找出能夠使起始基因序列變化為目標(biāo)基因序列所需的最少變化次數(shù)。如果無(wú)法實(shí)現(xiàn)目標(biāo)變化,請(qǐng)返回 -1。
        注意:
        起始基因序列默認(rèn)是合法的,但是它并不一定會(huì)出現(xiàn)在基因庫(kù)中。
        如果一個(gè)起始基因序列需要多次變化,那么它每一次變化之后的基因序列都必須是合法的。
        假定起始基因序列與目標(biāo)基因序列是不一樣的。

        示例

        示例 1:
        start: "AACCGGTT"
        end: "AACCGGTA"
        bank: ["AACCGGTA"]
        返回值: 1

        示例 2
        start: "AACCGGTT"
        end: "AAACGGTA"
        bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"]
        返回值: 2

        示例 3
        start: "AAAAACCC"
        end: "AACCCCCC"
        bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"]
        返回值: 3


        解題

        思路 :bfs
        將每個(gè)單詞用hash表存起來(lái)作為一個(gè)字典
        判斷end在不在里面,不在則直接返回-1
        將start入隊(duì)
        對(duì)每一層的每一個(gè)單詞,將它的每一位改成ATCG四個(gè)字母,改變之后如果單詞為end就返回bfs樹的層數(shù),如果不為end就判斷是否在字典里,在字典里就入隊(duì)。

        class?Solution?{
        private:
        ????unordered_set<string> st;

        ????bool?find_end(string& str, string& end, queue<string>& que)?{
        ????????vector<char> next({'A', 'C', 'T', 'G'});

        ????????for?(int?m = 0; m < str.size(); m++) {
        ????????????string?new_str = str;
        ????????????for?(int?n = 0; n < 4; n++) {
        ????????????????new_str[m] = next[n];
        ????????????????if?(new_str == end) {
        ????????????????????return?true;
        ????????????????}
        ????????????????if?(st.count(new_str)) {
        ????????????????????que.push(new_str);
        ????????????????????st.erase(new_str);
        ????????????????}
        ????????????}
        ????????}

        ????????return?false;
        ????}
        public:
        ????int?minMutation(string?start, string?end, vector<string>& bank)?{
        ????????st = unordered_set<string>(bank.begin(), bank.end());

        ????????if?(st.count(end) == 0) {
        ????????????return?-1;
        ????????}

        ????????queue<string> que;
        ????????que.push(start);
        ????????int?res = 0;

        ????????while?(!que.empty()) {
        ????????????res++;
        ????????????int?size = que.size();
        ????????????for?(int?i = 0; i < size; i++) {
        ????????????????string?str = que.front();
        ????????????????que.pop();

        ????????????????if?(find_end(str, end, que)) {
        ????????????????????return?res;
        ????????????????}
        ????????????}
        ????????}

        ????????return?-1;
        ????}
        };


        好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

        上期推文:

        LeetCode1-420題匯總,希望對(duì)你有點(diǎn)幫助!

        LeetCode刷題實(shí)戰(zhàn)421:數(shù)組中兩個(gè)數(shù)的最大異或值

        LeetCode刷題實(shí)戰(zhàn)422:有效的單詞方塊

        LeetCode刷題實(shí)戰(zhàn)423:從英文中重建數(shù)字

        LeetCode刷題實(shí)戰(zhàn)424:替換后的最長(zhǎng)重復(fù)字符

        LeetCode刷題實(shí)戰(zhàn)425:?jiǎn)卧~方塊

        LeetCode刷題實(shí)戰(zhàn)426:將二叉搜索樹轉(zhuǎn)化為排序的雙向鏈表

        LeetCode刷題實(shí)戰(zhàn)427:建立四叉樹

        LeetCode刷題實(shí)戰(zhàn)428:序列化和反序列化 N 叉樹

        LeetCode刷題實(shí)戰(zhàn)429:N 叉樹的層序遍歷

        LeetCode刷題實(shí)戰(zhàn)430:扁平化多級(jí)雙向鏈表

        LeetCode刷題實(shí)戰(zhàn)431:將 N 叉樹編碼為二叉樹

        LeetCode刷題實(shí)戰(zhàn)432:全 O(1) 的數(shù)據(jù)結(jié)構(gòu)


        瀏覽 41
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日本亚洲色大成网站www久久 | 蘑菇视频红色logo黑料 | 日韩污网站 | 男女啪啪啪免费网站 | 岳乳丰满一区二区三区 | 特大毛片| 五月天婷亚洲天综合网鲁鲁鲁 | 《头等舱》电影大尺度 | 肉丝高跟熟妇熟透啪啪 | 欧美日本在线 |