public List<String> findRepeatedDnaSequences(String s) {
List<String> res = new ArrayList<>();
Set<String> resSet = new HashSet<>();
if (s.length() < 10) return res;
Set<String> set = new HashSet<>();
for (int lo = 0, hi = lo + 10; hi <= s.length(); lo++,hi++) {
String sub = s.substring(lo, hi);
if (!set.add(sub)) {
resSet.add(sub);
}
}
res.addAll(resSet);
return res;
}
Rabin-Karp算法
public List<String> findRepeatedDnaSequences(String s) {
int M = 10;
int R = 4;
int RM = (int)Math.pow(4, 10);
int n = s.length();
if (n <= M) return new ArrayList<String>();
Map<Character, Integer> map = new HashMap<Character, Integer>(){{put('A', 0); put('C', 1); put('G', 2); put('T', 3);}};
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = map.get(s.charAt(i));
}
int h = 0;
Set<Integer> seen = new HashSet<>();
Set<String> res = new HashSet<>();
for (int i = 0; i < n-M+1; i++) {
if (i != 0) {
h = h * R - nums[i-1] * RM + nums[i+M-1];
}
else {
for (int j = 0; j < n; j++) {
h = h * R + nums[i];
}
}
if (seen.contains(h)) {
res.add(s.substring(i, i + M));
}
seen.add(h);
}
return new ArrayList<String>(res);
}
187. 重复的DNA序列
最新推荐文章于 2024-06-22 20:17:11 发布