Repeated DNA Sequences

题目要求 

思路:枚举法,想成有一个长度为10的框子,每次向左拉一个,然后把框子里的字符串放入到map中,最后map的value大于2的放进linklist中。

package stringHash;



import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


public class RepeatedDNASequences {
 public static List<String> findRepeatedDnaSequences(String s) {
     Map<String,Integer> map=new HashMap<String,Integer>();
     List<String>  list=new LinkedList<String>();
 int start=0;
 int end=10;
 while(start<s.length() && end<s.length()){
 String substring = s.substring(start, end);
 if(map.containsKey(substring)){
 Integer integer = map.get(substring);
 integer++;
 map.put(substring, integer);
 start+=1;
 end+=1;
 }else{
 map.put(substring, 1);
 start+=1;
 end+=1;
 }
 }
 for (String key:map.keySet()) {
if(map.get(key)>1){
list.add(key);
}
}
return list;
   }
 public static void main(String[] args) {
String s="AAAAAAAAAAA";
findRepeatedDnaSequences(s);
}

}



第二种 编码的方式做

package stringHash;


import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


public class RepeatedDNASequences2 {
 public static List<String> findRepeatedDnaSequences(String s) {
       List<String> res = new LinkedList<String>();
       HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
       for(int index = 10; index <= s.length(); index++){
           String substr = s.substring(index - 10, index);
           int code = encode(substr);
           System.out.println(code);
           if(map.containsKey(code)){
               if(map.get(code) == 1){
                   res.add(substr);
               }
               map.put(code, 2);
           } else {
               map.put(code, 1);
           }
       }
       return res;
   }
   
   private static int encode(String str){
       int code = 0;
       for(int i = 0; i < str.length(); i++){
           char c = str.charAt(i);
           // 每两位表示一个字符
           code <<= 2; //因为是向左移动,所以第一次移动的00,没有关系。
           //重点是比如3 或者 2 移动的时候要加到最低上  AAAAACC  0000000000000101 code=5
           //但是问题是 他不会巧合的相等吗?不会 因为是二进制的话。 比如AAAAAAAACT 
           //这个是6 但是如果再想拼个6出来比如AAAAAAAAGG  这是完全不是一个性质的东西
           switch(c){
               case 'A': code += 0; break;  //如果给二级制数加
               case 'C': code += 1; break;
               case 'T': code += 2; break;
               case 'G': code += 3; break;
           }
       }
       return code;
   }
 public static void main(String[] args) {
String s="AAAAAAAACT";
String t="AAAAAAAAAG";
findRepeatedDnaSequences(s);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值