int maxLen = 0; String ans = ""; StringBuilder sb = new StringBuilder(); for (int i = 0; i < len - 1; i++) { char ch = s.charAt(i); if (cnt[ch - 'a'] <= 1) { continue; }
for (int segLen = len - i; segLen > maxLen; segLen--) { sb.delete(0, sb.length()); sb.append(s, i, i + segLen); String str = s.substring(i + 1, len); if (str.contains(sb.toString()) && sb.length() > maxLen) { ans = sb.toString(); maxLen = Math.max(maxLen, sb.length()); break; } } }
public String longestDupSubstring(String s){ String ans = ""; int len = s.length(); int left = 0; int right = len - 1; while (left <= right) { int mid = left + (right - left + 1) / 2; String ret = searchWin(s, mid); if (ret.length() > 0) { left = mid + 1; ans = ret; } else { right = mid - 1; } }
return ans; }
public String searchWin(String s, int len){ int PRIME = 31; Set<Long> seen = new HashSet<>(); long hash = 0; long power = 1; for (int i = 0; i < len; i++) { hash = PRIME * hash + s.charAt(i); power *= PRIME; }
seen.add(hash);
for (int i = len; i < s.length(); i++) { hash = PRIME * hash + s.charAt(i) - power * s.charAt(i - len); String subStr = s.substring(i - len + 1, i + 1); if (seen.contains(hash) && s.indexOf(subStr) != i) { return subStr; }