编写一个Java程序,求字符串s中出现的最长的不重叠的重复子串,例如:s=”ababababa”,输出结果为”abab”。
时间: 2024-09-25 18:10:07 浏览: 36
java实现输出字符串中第一个出现不重复的字符详解
在Java中,我们可以使用滑动窗口和哈希集合(HashSet)来解决这个问题。以下是一个简单的示例程序:
```java
import java.util.HashSet;
public class LongestUnoverlappingSubstring {
public String longestRepeatedSubstring(String s) {
if (s == null || s.length() == 0) return "";
int n = s.length();
HashSet<Character> set = new HashSet<>();
int maxLen = 0;
int start = 0;
for (int i = 0; i < n; ++i) {
char ch = s.charAt(i);
// 如果字符已经在集合中,说明找到了重复子串,更新最大长度和起始位置
if (set.contains(ch)) {
start = Math.max(set.size(), start);
}
set.add(ch);
// 滑动窗口大小
maxLen = Math.max(maxLen, i - start + 1);
}
StringBuilder sb = new StringBuilder();
for (int i = start; i < start + maxLen && i < n; ++i) {
sb.append(s.charAt(i));
}
return sb.toString();
}
public static void main(String[] args) {
LongestUnoverlappingSubstring lus = new LongestUnoverlappingSubstring();
String s = "ababababa";
System.out.println(lus.longestRepeatedSubstring(s)); // 输出: "abab"
}
}
```
这个程序的工作原理是维护一个滑动窗口,其中包含当前找到的不重叠重复子串。当遇到相同的字符时,更新窗口的起始位置(start),并检查窗口的大小是否大于已知的最大长度。最后,从原始字符串中构建出最长的不重叠重复子串。
阅读全文