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

来源:互联网 发布:电锯惊魂公仔淘宝 编辑:程序博客网 时间:2024/06/15 21:29
原题链接: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.

欢迎优化!

1 0