日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串

發布時間:2024/8/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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中重复出现的子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。