文章目录
- 1. 题目
- 2. 解题
1. 题目
给定字符串 S,找出最长重复子串的长度
。如果不存在重复子串就返回 0。
示例 1:
输入:"abcd"
输出:0
解释:没有重复子串。示例 2:
输入:"abbaba"
输出:2
解释:最长的重复子串为 "ab" 和 "ba",每个出现 2 次。示例 3:
输入:"aabcaabdaab"
输出:3
解释:最长的重复子串为 "aab",出现 3 次。示例 4:
输入:"aaaaa"
输出:4
解释:最长的重复子串为 "aaaa",出现 2 次。提示:
字符串 S 仅包含从 'a' 到 'z' 的小写英文字母。
1 <= S.length <= 1500
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-repeating-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:
LeetCode 875. 爱吃香蕉的珂珂(二分查找)
LeetCode LCP 12. 小张刷题计划(二分查找)
LeetCode 1011. 在 D 天内送达包裹的能力(二分查找)
LeetCode 5438. 制作 m 束花所需的最少天数(二分查找)
- 直接二分查找重复子串的长度,检查是否存在重复子串
class Solution {
public:int longestRepeatingSubstring(string S) {int l = 0, r = S.size()-1, len, maxlen;while(l <= r){len = l+((r-l)>>1);if(haveRepeat(S, len))maxlen = len, l = len+1;elser = len-1;}return maxlen;}bool haveRepeat(string& S, int len){unordered_set<string> set;string sub;for(int i = 0; i <= S.size()-len; i++){sub = S.substr(i, len);if(!set.count(sub))set.insert(sub);elsereturn true;//有重复的子串}return false;}
};
44 ms 19.3 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!