LeetCode 187 Repeated DNA Sequences

LeetCode 187 Repeated DNA Sequences

All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA.

Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.

For example,
Given s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT",

Return:
["AAAAACCCCC", "CCCCCAAAAA"].

上來只能想到暴力搜索。。筷登。掃描字符串,對于每一個10bit的substring菲宴,check if除了這個substring以外,string的后半部分是否仍然含有這個substring趋急,可以用string.index(str)喝峦,若不是-1,則說明存在呜达。

但顯然超時了谣蠢。。查近。

為了防止每次都搜索一遍substring是否存在眉踱,不防將已經(jīng)出現(xiàn)過的10bit string放到一個hashset中,然后對于往后的substring霜威,都檢查是否出現(xiàn)過谈喳。這樣做的壞處是:存儲所有10bit string可能需要消耗過多內(nèi)存。

看discuss發(fā)現(xiàn)了很tricky的hashset+bit manipulation的方法戈泼。
bit manipulation真得挺難的婿禽,遇到這類題一直沒啥思路。大猛。扭倾。

對于搜索類的題,如果用hash map胎署,那有一個問題是吆录,再好的hash function,都可能存在collision琼牧,那為什么這題用hash,仍然可以避免collision呢哀卫?

這就是因為巨坊,本題的string只可能有4種字符(ATCG),再結(jié)合bit manipulation就可以創(chuàng)造一種不發(fā)生沖突的方式此改!

同時減少memory storage趾撵,因為直接存10bit的substring,太浪費內(nèi)存了!U嫉鳌暂题!

我們希望盡量減少存儲所用的bit數(shù)量,而因為僅有4種字符究珊,考慮使用兩位二進制數(shù)薪者,表示這四個字符!=虽獭言津!

0 = 00 (bits in binary number system) = 'A'
1 = 01 (bits in binary number system) = 'C'
2 = 10 (bits in binary number system) = 'G'
3 = 11 (bits in binary number system) = 'T'

因此10bit的substring只需要10*2=20位,就可以表示取试,而一般的integer都需要4bytes也就是32位悬槽。

以"AACCTCCGGT" 為例:
A A C C T C C G G T
00 00 01 01 11 01 01 10 10 11 = 00000101110101101011 (binary) = 23915 (decimal)

用兩個hashset分別存儲出現(xiàn)過的substring,和已經(jīng)出現(xiàn)過兩次的substring瞬浓,某substring出現(xiàn)第二次時初婆,將其加入結(jié)果list中。

注意這里v就是20bit的string轉(zhuǎn)成的數(shù)猿棉,用于存儲在hashset中0跖选!铺根!
這里運用到左移與或運算宪躯,還有0xfffff的mask運算。

Set<Integer> seq = new HashSet<>();
Set<Integer> repeatedSeq = new HashSet<>();

v = (v<<2 | map.get(s.charAt(i))) & 0xfffff; 

if (!seq.add(v) && repeatedSeq.add(v))

代碼:

public class Solution {
    public List<String> findRepeatedDnaSequences(String s) {
        List<String> seqs = new ArrayList<>();
        Set<Integer> seq = new HashSet<>();
        Set<Integer> repeatedSeq = new HashSet<>();
        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        map.put('A',0);
        map.put('C',1);
        map.put('G',2);
        map.put('T',3);
        
        int v = 0;
        // Use a sliding window to check every 10-bit substring
        for (int i = 0; i < s.length(); i++) {
            // 2 bits/char * 10 char = 20 bits so use 0xfffff
            v = (v<<2 | map.get(s.charAt(i))) & 0xfffff; 
            if (i < 9) continue;
            // Check each 10-bit substring
            else {
                // If first come out duplicates, then add to list
                if (!seq.add(v) && repeatedSeq.add(v))
                    seqs.add(s.substring(i-9, i+1));
            }
        }
        
        return seqs;
    }
}

參考:
https://discuss.leetcode.com/topic/8894/clean-java-solution-hashmap-bits-manipulation/9

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末位迂,一起剝皮案震驚了整個濱河市访雪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掂林,老刑警劉巖臣缀,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泻帮,居然都是意外死亡精置,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門锣杂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脂倦,“玉大人,你說我怎么就攤上這事元莫±底瑁” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵踱蠢,是天一觀的道長火欧。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么苇侵? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任赶盔,我火速辦了婚禮,結(jié)果婚禮上榆浓,老公的妹妹穿的比我還像新娘于未。我一直安慰自己,他們只是感情好哀军,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布沉眶。 她就那樣靜靜地躺著,像睡著了一般杉适。 火紅的嫁衣襯著肌膚如雪谎倔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天猿推,我揣著相機與錄音片习,去河邊找鬼。 笑死蹬叭,一個胖子當著我的面吹牛藕咏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秽五,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼孽查,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坦喘?” 一聲冷哼從身側(cè)響起盲再,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓣铣,沒想到半個月后答朋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡棠笑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年梦碗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖救。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡洪规,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出循捺,到底是詐尸還是另有隱情淹冰,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布巨柒,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洋满。R本人自食惡果不足惜晶乔,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牺勾。 院中可真熱鬧正罢,春花似錦、人聲如沸驻民。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽回还。三九已至裆泳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柠硕,已是汗流浹背工禾。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝗柔,地道東北人闻葵。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像癣丧,于是被迫代替她去往敵國和親槽畔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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