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

原题链接: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.

欢迎优化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值