LeetCode187. 重複的DNA序列
阿新 • • 發佈:2018-12-18
題目
所有 DNA 由一系列縮寫為 A,C,G 和 T 的核苷酸組成,例如:“ACGAATTCCG”。在研究 DNA 時,識別 DNA 中的重複序列有時會對研究非常有幫助。
編寫一個函式來查詢 DNA 分子中所有出現超多一次的10個字母長的序列(子串)。
示例:
輸入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 輸出: ["AAAAACCCCC", "CCCCCAAAAA"]
分析
自己單純用hash表做的,遍歷每一個字串,一共是len-9個字串。
因為這個題的標籤是位運算嘛,我也沒有想到該怎麼用位運算,提交之後看了別人的程式碼,然後跟著解題報告琢磨了會兒,原來是這樣的~
因為就只有四個核苷酸,那我們可以這樣表示,A--> 00, C --> 01, G --> 10, T--> 11;也就是A=0,C=1,G=2,T=3。
現在可以表示ACGT了,接著就是利用位運算來表示這個字串的各個10長度子串。
每次都要先左移兩位,然後和字元做與運算,
最後把我們10長度子串代表的數字放入set中。方便判斷重複與否。看程式碼吧,說的不清楚。
程式碼
//這個是我自己寫的沒有腦子的程式碼 class Solution { public List<String> findRepeatedDnaSequences(String s) { Map<String,Integer> map = new HashMap<String, Integer>(); List<String> list = new ArrayList<String>(); for (int i = 0; i <= s.length()-10; i++) { String sm = s.substring(i,i+10); if (map.containsKey(sm)){ if (map.get(sm) < 2) list.add(sm); map.put(sm,2); }else{ map.put(sm,1); } } return list; } }
public class Solution { public List<String> findRepeatedDnaSequences(String s) { Set<Integer> words = new HashSet<>(); Set<Integer> doubleWords = new HashSet<>(); List<String> res = new ArrayList<>(); char[] map = new char[26]; //map['A'-'A'] = 0; 將字元轉換為數字對映 map['C'-'A'] = 1; map['G'-'A'] = 2; map['T'-'A'] = 3; for(int i=0; i<s.length()-9; i++){ int str = 0; for(int j=i; j<i+10; j++){ //找到當前十個字元的子串 str <<= 2; str |= map[s.charAt(j)-'A']; } if(!words.add(str) && doubleWords.add(str)){ //子串出現次數大於一次時,將子串儲存進結果集 res.add(s.substring(i, i+10)); } } return res; } }