您的位置:首页 > 产品设计 > UI/UE

187. Repeated DNA Sequences | Java最短代码实现

2016-03-24 20:53 351 查看
原题链接:187. Repeated DNA Sequences
【思路】

本题考查hashmap和位运算的综合。我们首先来看字母 ”A" "C" “G" "T" 的ASCII码,分别是65, 67, 71, 84,二进制表示为 1000001, 1000011, 1000111, 1010100。可以看到红色部分2bit
就可以区分不同的字符。那么一共需要2 × 10 = 20bit,用第21 - 1位就可以存储10个字母,然后把这20位值转化为int作为hashmap的key,来判断该字符是否出现过:

public List<String> findRepeatedDnaSequences(String s) {
List<String> result = new ArrayList<String>();
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int key = 0;
for (int i = 0; i < s.length(); i++) {
key = ((key << 2) | (s.charAt(i) & 0x6)) & 0x1fffff;
if (i < 9) continue;
if (map.get(key) == null) {  //以前未出现过该字符串
map.put(key, 1);
} else if (map.get(key) == 1) {  //该字符串已出现过一次
result.add(s.substring(i - 9, i + 1));
map.put(key, 2);  //标记该字符串出现超过一次
}
}
return result;
}


30 / 30 test
cases passed. Runtime: 49
ms Your runtime beats 32.71% of javasubmissions.

欢迎优化!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: