题目描述:定义重复字符串是由两个相同的字符串首尾拼接而成。例如:"abcabc" 是一个长度为 6 的重复字符串,因为它由两个 "abc" 串拼接而成;"abcba"不是重复字,例如输入:ababc,输出4,因为abab为最长重复字符串
时间: 2024-09-06 16:03:46 浏览: 84
这个题目是一个经典的字符串处理问题,需要我们找出给定字符串中最长的重复子序列,即连续子串中有两个完全相等的部分。这个问题可以用滑动窗口或者动态规划来解决。
**解决方案**:
1. **滑动窗口法**:初始化两个指针i和j(分别代表左边界和右边界),并让它们都指向第一个字符。然后开始移动右边界j,当`s.substring(i, j+1)`等于`s.substring(j+1, j+1+i-j)`(也就是重复部分),就更新最长重复子串的长度和起始位置。如果条件不满足,我们就把左边界i向右移动一位。
2. **动态规划**:创建一个二维数组dp,其中dp[i][j]表示s从下标i到j的子串是否重复。我们可以遍历字符串,若s[i] == s[j]且j-i+1 == dp[i+1][j-1](意味着s[i:j]是s[i+1:j-1]的重复),那么dp[i][j]就是true,更新最长重复子串。
```java
public int lengthOfLongestSubstring(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int maxLen = 0, start = 0;
for (int len = 2; len <= n; len++) {
for (int i = 0; i <= n - len; i++) {
int j = i + len - 1;
if (len == 2 && s.charAt(i) == s.charAt(j)) { // special case for substring of length 2
dp[i][j] = true;
maxLen = Math.max(maxLen, len);
} else if (len > 2 && s.charAt(i) == s.charAt(j) && dp[i+1][j-1]) {
dp[i][j] = true;
maxLen = Math.max(maxLen, len);
}
}
}
return maxLen;
}
// 输入:"ababc"
// 输出:4,因为最长重复子串是"abab"
```
阅读全文