java动态规划给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
时间: 2023-10-14 17:14:22 浏览: 87
寻找字符串中不包含重复字符的最长子串
可以使用动态规划来解决这个问题。
首先定义状态:dp[i]表示以第i个字符结尾的最长不重复子串的长度。
状态转移方程为:
- 如果第i个字符之前没有出现过,则dp[i] = dp[i-1] + 1。
- 如果第i个字符之前出现过,记其上一次出现的位置为j,如果j在dp[i-1]的范围内(即j >= i - dp[i-1]),那么dp[i] = i - j,表示当前字符可以与上一次出现的字符组成新的不重复子串;如果j不在dp[i-1]的范围内,那么dp[i] = dp[i-1] + 1,表示当前字符只能和上一个字符组成不重复子串。
最终的答案就是dp数组中的最大值。
Java代码实现如下:
```java
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int n = s.length();
int[] dp = new int[n];
dp[0] = 1;
int maxLen = 1;
for (int i = 1; i < n; i++) {
int j = i - dp[i-1];
int k = s.substring(j, i).indexOf(s.charAt(i));
if (k == -1) {
dp[i] = dp[i-1] + 1;
} else {
dp[i] = i - j;
}
maxLen = Math.max(maxLen, dp[i]);
}
return maxLen;
}
```
阅读全文