//

给定字符串 S,找出最长重复子串的长度。如果不存在重复子串就返回 0

// //

 

// //

示例 1:

// //
输入:"abcd"
//输出:0
//解释:没有重复子串。
//
// //

示例 2:

// //
输入:"abbaba"
//输出:2
//解释:最长的重复子串为 "ab" 和 "ba",每个出现 2 次。
//
// //

示例 3:

// //
输入:"aabcaabdaab"
//输出:3
//解释:最长的重复子串为 "aab",出现 3 次。
//
// //

示例 4:

// //
输入:"aaaaa"
//输出:4
//解释:最长的重复子串为 "aaaa",出现 2 次。
// //

 

// //

提示:

// //
    //
  1. 字符串 S 仅包含从 'a' 到 'z' 的小写英文字母。
  2. //
  3. 1 <= S.length <= 1500
  4. //
//
Related Topics
  • 字符串
  • 二分查找
  • 动态规划
  • 后缀数组
  • 哈希函数
  • 滚动哈希

  • 👍 72
  • 👎 0
  • package leetcode.editor.cn; import cn.hutool.core.lang.hash.Hash; import java.util.HashSet; // 1062:最长重复子串 public class LongestRepeatingSubstring { public static void main(String[] args) { Solution solution = new LongestRepeatingSubstring().new Solution(); // TO TEST } //leetcode submit region begin(Prohibit modification and deletion) class Solution { public int longestRepeatingSubstring(String s) { int left = 1; int right = s.length(); while (left <= right) { int mid = (right - left) / 2 + left; if (search(s, mid) != -1) { left = mid + 1; } else { right = mid - 1; } } return left - 1; } private int search(String str, int length) { HashSet hashSet = new HashSet<>(); for (int i = 0; i <= str.length() - length; i++) { int hashCode = str.substring(i, i + length).hashCode(); if (hashSet.contains(hashCode)) { return hashCode; } hashSet.add(hashCode); } return -1; } } //leetcode submit region end(Prohibit modification and deletion) }