标签:
原题链接在这里:https://leetcode.com/problems/repeated-dna-sequences/
从头去长度为10的字符串,每次后移一位,放入HashSet中,若是HashSet中已有了,就放到res里,同时保证res里没有重复的。
这个方法Time O(n), n是s的长度。占用了一个set, Space O(n).
更为快捷的方法是因为字符只有四种,所以可以用长度为10的字符串算出hashcode 往 HashSet里放,如此可以节省比较substring字符串的时间。
算hashcode时,A为00; C为01; G为10; T为11. 每次hash位运算左移两位,后两位就变成0了,再和新的字符代表数字做位运算或。
AC Java:
1 public class Solution { 2 public List<String> findRepeatedDnaSequences(String s) { 3 List<String> res = new ArrayList<String>(); 4 if(s == null || s.length() < 11){ 5 return res; 6 } 7 8 HashSet<Integer> hs = new HashSet<Integer>(); 9 for(int i = 0; i<=s.length()-10; i++){ 10 String subString = s.substring(i,i+10); 11 int hashcode = getHash(subString); 12 13 if(hs.contains(hashcode) && !res.contains(subString)){ 14 res.add(subString); 15 }else{ 16 hs.add(hashcode); 17 } 18 } 19 return res; 20 } 21 22 private int getHash(String s){ 23 HashMap<Character, Integer> hm = new HashMap<Character, Integer>(); 24 hm.put(‘A‘, 0); 25 hm.put(‘C‘, 1); 26 hm.put(‘G‘, 2); 27 hm.put(‘T‘, 3); 28 29 int hash = 0; 30 for(int i = 0; i<s.length(); i++){ 31 hash = hash << 2 | hm.get(s.charAt(i)); 32 } 33 return hash; 34 } 35 }
LeetCode Repeated DNA Sequences
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4929799.html