字符串哈希.Ranbin-karp

187. Repeated DNA Sequences
The DNA sequence is composed of a series of nucleotides abbreviated as ‘A’, ‘C’, ‘G’, and ‘T’.

For example, “ACGAATTCCG” is a DNA sequence.
When studying DNA, it is useful to identify repeated sequences within the DNA.

Given a string s that represents a DNA sequence, return all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule. You may return the answer in any order.

题目要求找出满足目标子串的长度为1010,且在 DNA 字符串s中出现次数超过一次的所有子串。

遍历字符串,统计所有长度为1010的子串的出现次数,这里需要解决两个问题。

第一个问题,如何截取长度为10的子串。可以借助 substrsubstr函数,或者自己实现一个函数,维护一个长度为10的子串,每次删除最前面第一个字符,从最后面增加一个字符。
第二个问题,如何统计截取长度为10的子串的出现次数。可以借助哈希表,实现O(1)O(1)的插入和删除。
最后,遍历哈希表中的元素,统计出现次数超过一次的数量即可。

优化点在第二点。
如何统计截取长度为10的子串的出现次数。每次循环构造子字符串的复杂度都是O(L),总复杂度在O(NL)。
注意到字符串只会出现四种字符,2-bit就可以表示。子字符串长度为10,因此20bit就可以表示整个子字符串。因此一个int就足够了。这样将每次循环的子字符串转int就很容易了。但是如果每次都一个字符一个字符的转int,那么复杂度还是O(NL),联想到循环中前后两次的字符串实际就相差一个字符,即前一个substr的第一个字符删除,后一个substr添加新字符。而这一点很容易用位运算表示,这样就可以通过这种滑动窗口的形式以O(1)的复杂度得到当前substr的int。

1044. 最长重复子串
给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。
返回 任意一个 可能具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 “” 。

rabin-karp + 二分

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值