LeetCode187-Repeated DNA Sequences

思路

  • 由于堿基無(wú)非ACGT四種類型,可以使用00 01 10 11四個(gè)狀態(tài)代替ACGT四種堿基忿偷,比如AAGCT就是00 00 10 01 11,對(duì)任意一個(gè)長(zhǎng)度為10的子串都可以轉(zhuǎn)化使用20個(gè)位的int值hint臊泌。這樣就可將unordered_set<string> repeated轉(zhuǎn)變?yōu)?code>unordered_set<int> repeated, 一定程度上減少了所需的存儲(chǔ)空間鲤桥。
  • 對(duì)于如何去重, 其一可以先收集所有答案,再sort渠概,unique去重茶凳,當(dāng)然這樣很慢也很麻煩。其二播揪,可以再構(gòu)造一個(gè)unordered_set<int> check贮喧,用于存儲(chǔ)已經(jīng)存入answer中的重復(fù)子串對(duì)應(yīng)的hint值;
  • 值得一提的是,每次從s[i]->s[i+9]變?yōu)閟[i+1]->s[i+10]猪狈,使用了這樣一個(gè)方法:
hint = ((hint & eraser) << 2) + ati[s[i]];

其中eraser是一個(gè)宏定義, 值為0x3ffff, 二進(jìn)制是00111111111111111111, 用于擦除hint中的最高2位s[i]堿基對(duì)應(yīng)的值, 再左移2, 最后加上s[i+10]的堿基對(duì)應(yīng)的值箱沦。

class Solution {
public:
    #define eraser 0x3ffff
    vector<string> findRepeatedDnaSequences(string s) {
        vector<string> answer;
        int hint = 0;//存儲(chǔ)長(zhǎng)度為10的子串翻譯后的int值
        if (s.size() < 10)
            return answer;
        unordered_set<unsigned int> repeated, check;//repeated存儲(chǔ)已出現(xiàn)的子串, check用于防止重復(fù)答案
        unordered_map<char, unsigned int> ati{{'A', 0}, {'C', 1}, {'G', 2}, {'T', 3}};//此處ati是存儲(chǔ)各堿基對(duì)應(yīng)的值00 01 10 11(c++11新語(yǔ)法)
        for (int i = 0; i != 10; ++i) {
            hint = (hint << 2) + ati[s[i]];//用s的前10個(gè)堿基構(gòu)造初始hint值
        }
        repeated.insert(hint);
        for (int i = 10; i != s.size(); ++i) {
            hint = ((hint & eraser) << 2) + ati[s[i]]; //子串變化對(duì)應(yīng)hint值變化
            unordered_set<unsigned int>::iterator it = repeated.find(hint);
            if (it != repeated.end()) {
                it = check.find(hint);
                if (it == check.end()) {
                    answer.push_back(string(s, i - 9, 10));
                    check.insert(hint);
                }
            }
            else
                repeated.insert(hint);
        }
        return answer;
    }
};

一開(kāi)始由于忽略了移位與其他運(yùn)算符的優(yōu)先級(jí)關(guān)系, 一直出問(wèn)題,郁悶:(

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雇庙,一起剝皮案震驚了整個(gè)濱河市谓形,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疆前,老刑警劉巖寒跳,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竹椒,居然都是意外死亡童太,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)胸完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)书释,“玉大人,你說(shuō)我怎么就攤上這事舶吗≌骼洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵誓琼,是天一觀的道長(zhǎng)检激。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腹侣,這世上最難降的妖魔是什么叔收? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮傲隶,結(jié)果婚禮上饺律,老公的妹妹穿的比我還像新娘。我一直安慰自己跺株,他們只是感情好复濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布脖卖。 她就那樣靜靜地躺著,像睡著了一般巧颈。 火紅的嫁衣襯著肌膚如雪畦木。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,268評(píng)論 1 309
  • 那天砸泛,我揣著相機(jī)與錄音十籍,去河邊找鬼。 笑死唇礁,一個(gè)胖子當(dāng)著我的面吹牛勾栗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盏筐,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼围俘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了机断?” 一聲冷哼從身側(cè)響起楷拳,我...
    開(kāi)封第一講書(shū)人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吏奸,沒(méi)想到半個(gè)月后欢揖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奋蔚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年她混,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泊碑。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坤按,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馒过,到底是詐尸還是另有隱情臭脓,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布腹忽,位于F島的核電站来累,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窘奏。R本人自食惡果不足惜嘹锁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望着裹。 院中可真熱鬧领猾,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拯坟,卻和暖如春但金,著一層夾襖步出監(jiān)牢的瞬間韭山,已是汗流浹背郁季。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钱磅,地道東北人梦裂。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盖淡,于是被迫代替她去往敵國(guó)和親年柠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容