[leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串
生活随笔
收集整理的這篇文章主要介紹了
[leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很重要的一道題
題型適合在面試的時候考
位操作和哈希表結合
public List<String> findRepeatedDnaSequences(String s) {/*尋找出現過一次以上的十個字母長的子串最簡單的想法是把每個長度為10的子串存到hashtable中,但是這肯定不符合出題人的意思,要考察位操作看了答案,使用位操作,第一次做bit manipulation的題由于A\C\G\T的ASCII碼,后三位各不相同,所以我們只要考慮字符的后三位就行用一個int類型來代表遍歷序列,每次把一個字符添加到序列末尾(添加方式是左移3位然后|上下一個字符的后三位)這樣每次用一個掩碼提取后27位并|后一位字符代表當前子串,記錄到hashtable中,這樣用一個int數字代替一個子串,會節省內存這里不直接提取后30位的原因是,如果提取30位再向左移3位會超出int范圍,而且32位計算機會溢出所以先提取27位再左移再或*/int l = s.length();List<String> res = new ArrayList<>();if(l<=10){return res;}Map<Integer,Integer> map = new HashMap<>();//位操作序列int cur = 0;//掩碼1,用來提取后27位int mask = 0x7ffffff;//先把前27位添加上,以后就可以循環實現了for (int i = 0; i < 9; i++) {//每次左移3位,空出位置用于添加,&7是提取后三位cur = (cur<<3)|(s.charAt(i)&7);}//開始記錄和查詢for (int i = 9; i < l; i++) {cur = ((cur&mask)<<3)|(s.charAt(i)&7);map.put(cur,map.getOrDefault(cur,0)+1);//只在第二次出現時添加,第三次,第四次...不添加//一開始想著全部添加到map中在遍歷key來添加,但是發現那時候就沒有字符index:i了,如果用key還原子串很麻煩if (map.get(cur)==2)res.add(s.substring(i-9,i+1));}return res;}?
轉載于:https://www.cnblogs.com/stAr-1/p/8311442.html
總結
以上是生活随笔為你收集整理的[leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阻滞增长模型求解_马尔萨斯与阻滞增长模型
- 下一篇: LINUX串口驱动安装 一条龙服务