码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Repeated DNA Sequences

时间:2015-11-02 13:54:49      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

原题链接在这里: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!