Leetcode 187.重复的DNA序列

 链接: https://leetcode-cn.com/problems/repeated-dna-sequences/

 思路:

前缀字符串哈希:

        一般用于比较两个字符串是否相等;使用该算法默认不会出现哈希冲突

        将字符串看做P进制的数,P一般为131或13331;计算前缀子串hash存入数组h

        使用前缀和计算区间子串的hash值然后使用HashMap进行判断是否出现多次

字符串计算后的结果会很大,可以使用MOD = 2^{64}计算,使用long存储;在c++中可以使用unsigned long long, 溢出相当于取模

getOrDefault(key,default)
作用:如果存在相应的key则返回其对应的value,否则返回给定的默认值。

返回的结果为key对应的value值

代码: 

private int P = 13331;
    private long MOD = Long.MAX_VALUE;
    private static final int N = 100010;
    private long[] p = new long[N];
    private long[] h = new long[N];

    public List<String> findRepeatedDnaSequences(String s) {
        int len = s.length();
        // 预处理
        p[0] = 1;
        for (int i = 1; i <= len; i++) {
            p[i] = p[i - 1] * P;
            h[i] =  ((h[i - 1] * P) + s.charAt(i - 1)) % MOD;  // hash
        }
        
        Map<Long, Integer> map = new HashMap<>();

        List<String> res = new ArrayList<>();
        for (int l = 1; l + 9 <= len; l ++) {
            long hash = get(l, l + 9);
            Integer orDefault = map.getOrDefault(hash, 0);
            if (orDefault == 1) res.add(s.substring(l - 1, l + 9));
            map.put(hash, orDefault + 1);
        }

        return res;

    }

    private long get(int l, int r) {
        return h[r] - h[l - 1] * p[r - l + 1];
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值