题目要求
思路:枚举法,想成有一个长度为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);
}
}