欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C++怎么求重復的DNA序列

這篇文章主要介紹“C++怎么求重復的DNA序列”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++怎么求重復的DNA序列”文章能幫助大家解決問題。

公司主營業(yè)務:做網(wǎng)站、網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出前進免費做網(wǎng)站回饋大家。

求重復的DNA序列

Example:

Input: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"

Output: ["AAAAACCCCC", "CCCCCAAAAA"]

看到這道題想到這應該屬于 CS 的一個重要分支生物信息 Bioinformatics 研究的內(nèi)容,研究 DNA 序列特征的重要意義自然不用多說,但是對于我們廣大碼農(nóng)來說,還是專注于算法吧,此題還是用位操作 Bit Manipulation 來求解,計算機由于其二進制存儲的特點可以很巧妙的解決一些問題,像之前的 Single Number 和 Single Number II 都是很巧妙利用位操作來求解。此題由于構成輸入字符串的字符只有四種,分別是 A, C, G, T,下面來看下它們的 ASCII 碼用二進制來表示:

A: 0100 0001  C: 0100 0011  G: 0100 0111  T: 0101 0100

由于目的是利用位來區(qū)分字符,當然是越少位越好,通過觀察發(fā)現(xiàn),每個字符的后三位都不相同,故而可以用末尾三位來區(qū)分這四個字符。而題目要求是 10 個字符長度的串,每個字符用三位來區(qū)分,10 個字符需要30位,在 32 位機上也 OK。為了提取出后 30 位,還需要用個 mask,取值為 0x7ffffff,用此 mask 可取出后27位,再向左平移三位即可。算法的思想是,當取出第十個字符時,將其存在 HashMap 里,和該字符串出現(xiàn)頻率映射,之后每向左移三位替換一個字符,查找新字符串在 HashMap 里出現(xiàn)次數(shù),如果之前剛好出現(xiàn)過一次,則將當前字符串存入返回值的數(shù)組并將其出現(xiàn)次數(shù)加一,如果從未出現(xiàn)過,則將其映射到1。為了能更清楚的闡述整個過程,就用題目中給的例子來分析整個過程:

首先取出前九個字符 AAAAACCCC,根據(jù)上面的分析,用三位來表示一個字符,所以這九個字符可以用二進制表示為 001001001001001011011011011,然后繼續(xù)遍歷字符串,下一個進來的是C,則當前字符為 AAAAACCCCC,二進制表示為 001001001001001011011011011011,然后將其存入 HashMap 中,用二進制的好處是可以用一個 int 變量來表示任意十個字符序列,比起直接存入字符串大大的節(jié)省了內(nèi)存空間,然后再讀入下一個字符C,則此時字符串為 AAAACCCCCA,還是存入其二進制的表示形式,以此類推,當某個序列之前已經(jīng)出現(xiàn)過了,將其存入結果 res 中即可,參見代碼如下:

解法一:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        vector<string> res;
        if (s.size() <= 10) return res;
        int mask = 0x7ffffff, cur = 0;
        unordered_map<int, int> m;
        for (int i = 0; i < 9; ++i) {
            cur = (cur << 3) | (s[i] & 7);
        }
        for (int i = 9; i < s.size(); ++i) {
            cur = ((cur & mask) << 3) | (s[i] & 7);
            if (m.count(cur)) {
                if (m[cur] == 1) res.push_back(s.substr(i - 9, 10));
                ++m[cur]; 
            } else {
                m[cur] = 1;
            }
        }
        return res;
    }
};

上面的方法可以寫的更簡潔一些,這里可以用 HashSet 來代替 HashMap,只要當前的數(shù)已經(jīng)在 HashSet 中存在了,就將其加入 res 中,這里 res 也定義成 HashSet,這樣就可以利用 HashSet 的不能有重復項的特點,從而得到正確的答案,最后將 HashSet 轉(zhuǎn)為 vector 即可,參見代碼如下

解法二:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        unordered_set<string> res;
        unordered_set<int> st;
        int cur = 0;
        for (int i = 0; i < 9; ++i) cur = cur << 3 | (s[i] & 7);
        for (int i = 9; i < s.size(); ++i) {
            cur = ((cur & 0x7ffffff) << 3) | (s[i] & 7);
            if (st.count(cur)) res.insert(s.substr(i - 9, 10));
            else st.insert(cur);
        }
        return vector<string>(res.begin(), res.end());
    }
};

上面的方法都是用三位來表示一個字符,這里可以用兩位來表示一個字符,00 表示A,01 表示C,10 表示G,11 表示T,那么總共需要 20 位就可以表示十個字符流,其余的思路跟上面的方法完全相同,注意這里的 mask 只需要表示 18 位,所以變成了 0x3ffff,參見代碼如下:

解法三:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        unordered_set<string> res;
        unordered_set<int> st;
        unordered_map<int, int> m{{"A", 0}, {"C", 1}, {"G", 2}, {"T", 3}};
        int cur = 0;
        for (int i = 0; i < 9; ++i) cur = cur << 2 | m[s[i]];
        for (int i = 9; i < s.size(); ++i) {
            cur = ((cur & 0x3ffff) << 2) | (m[s[i]]);
            if (st.count(cur)) res.insert(s.substr(i - 9, 10));
            else st.insert(cur);
        }
        return vector<string>(res.begin(), res.end());
    }
};

如果不需要考慮節(jié)省內(nèi)存空間,那可以直接將 10個 字符組成字符串存入 HashSet 中,那么也就不需要 mask 啥的了,但是思路還是跟上面的方法相同:

解法四:

class Solution {
public:
    vector<string> findRepeatedDnaSequences(string s) {
        unordered_set<string> res, st;
        for (int i = 0; i + 9 < s.size(); ++i) {
            string t = s.substr(i, 10);
            if (st.count(t)) res.insert(t);
            else st.insert(t);
        }
        return vector<string>{res.begin(), res.end()};
    }
};

關于“C++怎么求重復的DNA序列”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

網(wǎng)站標題:C++怎么求重復的DNA序列
網(wǎng)頁URL:http://aaarwkj.com/article28/gjggjp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站改版、虛擬主機、網(wǎng)站制作、移動網(wǎng)站建設、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設
av在线高清免费观看| 日本人妻三级精品久久| 国产美女主播视频一区二区三区| 日韩50岁老女人骚色| 精品欧美一区二区在线| 国产有码日产一区在线观看| 91日韩国产中文字幕| 小黄片免费在线播放观看| 日本东京热免一区二区| 人妻少妇偷人精品免费看| 欧美日韩亚洲一区视频| av电影网站中文字幕| 精品自拍一区在线观看| 免费精品99久久久国产| 国产日韩欧美亚洲中文| 亚洲av天堂一区二区香蕉| 极品大胸美女被啪啪的高潮| 成人精品国产亚洲av| 十八禁在线观看网址免费| 加勒比人妻一区二区三区| 日韩欧美中文在线一区二区| 色婷婷中文字幕久久久| 一区二区亚洲免费的视频| 精品啪在线观看国产熟女| 亚洲福利视频在线观看免费| 尤物视频网站在线观看| 国产91高清在线观看| 成人色视频免费在线观看| 成人性生交大片免费男同| 日本高清视频免费一区| 亚洲二区三区四区在线| 亚洲av少妇一区二区成年男人| 久久精品国产精品亚洲片| 亚洲熟妇av乱码在线观看| 亚洲天堂免费观看av| 亚洲精品国产第一区第二区 | 蜜桃午夜精品一区二区三区| 日本免费中文字幕在线| 小黄片免费在线播放观看| 日韩av有码在线播放| 国产一级夫妻性生活欧美|