原题链接:力扣
描述:
给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。
返回 任意一个 具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 "" 。
示例 1:
输入:s = "banana"
输出:"ana"
示例 2:
输入:s = "abcd"
输出:""
提示:
2 <= s.length <= 3 * 104
s 由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-duplicate-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
代码:
解法1:滑动窗口
public String longestDupSubstring(String s) {
String maxStr = "";
String curStr = "";//滑动窗口
int num = 0;
//复杂度:n2
for (int i = 0, j = 0; i < s.length(); i++) {
if (j == s.length() - 1) {
break;
}
while (j < s.length()) {
curStr = s.substring(i, j + 1);
j++;
num++;
//如果匹配的字符串长度较多,这个比较合适,indexOf的效率高
if (s.indexOf(curStr, i+1) <= i) {
break;
}
if (curStr.length() > maxStr.length()) {
maxStr = curStr;
}
}
}
System.out.println(num);
return maxStr;
}
解法二:二分查找+唯一值