目录

最长重复子串

C++代码


最长重复子串

1044. 最长重复子串

给出一个字符串 S,考虑其所有重复子串S 的连续子串,出现两次或多次,可能会有重叠)。

返回任何具有最长可能长度的重复子串。(如果 S 不含重复子串,那么答案为 ""。)

示例 1:

输入:"banana"
输出:"ana"

示例 2:

输入:"abcd"
输出:""

提示:

  1. 2 <= S.length <= 10^5
  2. S 由小写英文字母组成。

方法一:二分查找 + Rabin-Karp 字符串编码
分析

我们可以把这个问题分解成两个子问题:

从 1 到 N 中选取子串的长度 L;

检查字符串中是否存在长度为 L 的重复子串。

子任务一:二分查找

解决子问题一的最简单的方法是,我们从 L = N - 1 开始,依次递减选取子串的长度,并进行判断。如果发现存在长度为 L 的重复子串,就表示 L 是最长的可能长度。

但我们发现,如果字符串中存在长度为 L 的重复子串,那么一定存在长度为 L0 < L 的重复子串(选取长度为 L 的重复子串的某个长度为 L0 的子串即可),因此我们可以使用二分查找的方法,找到最大的 L。

子任务二:Rabin-Karp 字符串编码

我们可以使用 Rabin-Karp 算法将字符串进行编码,这样只要有两个编码相同,就说明存在重复子串。对于选取的长度 L:

使用长度为 L 的滑动窗口在长度为 N 的字符串上从左向右滑动;

检查当前处于滑动窗口中的子串的编码是否已经出现过(用一个集合存储已经出现过的编码);

若已经出现过,就说明找到了长度为 L 的重复子串;

若没有出现过,就把当前子串的编码加入到集合中。

C++代码

class Solution {
public:  //检查是针对存在重复子串 还是发生了哈希冲突bool check_hash(string& s, pair<int, int>& a, pair<int, int> b) {       //查看是否是真重复子串还是因为发生哈希碰撞而导致哈希值相同for (int i = a.first, j = b.first; i != a.second && j != b.second; ++i, ++j) {if (s[i] != s[j]) return false;}return true;}//检查字符串s中是否存在长度为len的重复子串,如果有则返回该子串,否则返回空字符串string check(string& s, int len){int base = 26;//二十六个字母对应二十六进制int mod = 1000007;//取模 避免哈希冲突int num = 0;for(int i = 0; i < len; i++)//计算出第一个len长度的哈希映射值num = (num * base + s[i] - 'a')%mod;unordered_map<int, pair<int, int>> seen;//存储的是哈希映射值及对应的坐标seen.insert({num, {0, len - 1}});int al = 1;//根据公式 计算出常数a的len次方for(int i = 1; i <= len; i++)al = (al * base)%mod;//遍历字符串 计算每一个长度为len的子串的哈希映射值for(int i = 1; i < s.size() - len + 1; i++){//计算长度为len的子串的哈希映射值num = num * base - ((s[i-1] - 'a') * al)%mod;while(num < 0) num += mod;num = (num + (s[i + len - 1] - 'a'))%mod;//查找是否有重复的子串if(seen.count(num))if(check_hash(s, seen[num], {i, i + len - 1}))return s.substr(i, len);//如果是真的存在而不是因为哈希冲突,就返回这个子串seen.insert({num, {i, i + len - 1}});//如果是哈希冲突 就插入}return "";}//返回字符串s最长重复子串string longestDupSubstring(string s) {int m = s.size();int left = 0, right = m;string res = "";while(left < right){int mid = left + (right - left)/2;//二分法找到最长重复子串string tmp = check(s, mid);if(!tmp.empty()){//如果存在重复子串,就保存下来最长的一个重复子串res = tmp.size() > res.size() ? tmp : res;left = mid + 1;}elseright = mid;}return res;}
};

最长重复子串(Rabin-Karp算法)相关推荐

  1. 试题 算法训练 后缀数组——最长重复子串

    资源限制 时间限制:100ms 内存限制:256.0MB 问题描述 给定一个长度为n的数串,求至少出现k 次的最长重复子串的长度,这k 个子串可以重叠.保证有子串出现至少k次. 输入格式 第一行:两个 ...

  2. Rabin Karp 算法详解及Python实现

    目录 一.Rabin Karp 核心思路 二.字符串如何做哈希映射 三.借助前缀和列表计算滑动窗口 四.leetcode28. 代码实现 Rabin Karp 算法是用于实现字符串的模式匹配,先看le ...

  3. 后缀数组求最长重复子串

    问题描述 给定一个字符串,求出其最长重复子串 例如:abcdabcd 最长重复子串是 abcd,最长重复子串可以重叠 例如:abcdabcda,这时最长重复子串是 abcda,中间的 a 是被重叠的. ...

  4. 最长重复子串和最长不重复子串求解

    最长重复子串和最长不重复子串求解 本文内容框架: §1 最长重复子串 基本方法.KMP算法求解.后缀数组求解 §2 最长不重复子串 基本方法.动态规划.动态规划+Hash §3 小结 §1最长重复子串 ...

  5. 动态规划与最长重复子串 LRS and Dynamic Programming

    目录 最长重复子串问题 暴力遍历 动态规划 LRS问题中dp数组的意义 重叠问题 暴力遍历 dp解法 一些想法 动态规划和哈希表? s.substr()的时间复杂度? 碎碎念 最长重复子串问题 假设我 ...

  6. POJ1743——不可重迭的最长重复子串

    题意:给定一系列的整数作为音阶,旋律为相邻音阶之差.问最长的主旋律是多长,主旋律需满足3个条件: 1. 长度至少为5: 2. 至少重复出现2次: 3. 主旋律各不重迭. 对源进行变换以后,就是问不重迭 ...

  7. C++Rabin Karp算法字符串快速查找(附完整源码)

    C++Rabin Karp算法字符串快速查找 C++Rabin Karp算法字符串快速查找完整源码(定义,实现,main函数测试) C++Rabin Karp算法字符串快速查找完整源码(定义,实现,m ...

  8. #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)

    题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...

  9. 后缀数组--(可重叠最长重复子串问题)

    问题描述:给定一个字符串,求最长重复子串,这两个子串可以重叠. 其实问题可以转化为height数组的最大值.至于为什么是这样,我可以这样解释: 求可重叠最长重复子串等价于求两个后缀的最长公共前缀的最大 ...

最新文章

  1. jupyter配置默认启动目录
  2. 小朋友也能看懂的机器学习
  3. notepad++ html格式化
  4. 安装cactiez v11对windows和linux系统进行监控
  5. Python3.5 报错:NameError: name 'reload' is not defined
  6. 四十、Linux和ViM的使用
  7. 流水灯c语言程序延时失败,用c8051f340做控制流水灯实验,程序会卡死在延时函数中 ,只要在那加延时函数程序就只能跑到那,代码如下...
  8. vs mono linux,[.NET][C#.NET]走跳在Linux的人生(八).NET Core与Mono执行
  9. 使用python脚本定时备份web网站
  10. Non-resolvable parent POM for com.supermarket:supermarket:0.0.1-SNAPSHOT: Could not transfer artifac
  11. 21天Jmeter打卡day15 配置元件之用户定义的变量
  12. sicily 1022. Train Problem
  13. 集成电路经典资料分享
  14. [代码审计]Textpattern4.8.4任意文件上传漏洞
  15. 网络安全等级保护制度介绍
  16. oracle指定访问某表或某视图
  17. RHCE-ansible第三次实验,通过ansible自动化部署web服务
  18. python学习笔记--缓解眼睛疲劳的小工具
  19. 深度完美 XP SP3 完美优化DVD装机版 V2013
  20. Pygame(三)画圆

热门文章

  1. 【转】汇编语言学习笔记一:CS和IP寄存器
  2. 使用QT Creator开发C++程序
  3. SpringBoot从介绍到各个框架的整合
  4. leetcode 225 用队列实现栈(JS)
  5. 页面从输入 URL 到页面加载显示完成
  6. 软件工程第八次作业-2017282110249
  7. mysql -存储过程的学习
  8. Windows Server 2008 安装
  9. cacti + nagios + npc 整合部署
  10. 如何解决安装瑞星后用FoxMail收发邮件速度慢的问题。