Description
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
Solution
1. 采用动态规划法;
2. 指定dp[i]数组为第i个字符结尾的最大不重复子字符串,即对于"abcabcbb",dp = {1,2,3,3,3,3,2,1};
3. dp[i]可以通过dp[i-1]来获得,例如当第(i-dp[i-1])到第(i-1)字符均与第i个字符不一致,则dp[i] = dp[i-1] + 1;
否则找到与第i个字符一直的元素的索引index,dp[i] = i-index;
Code
public int lengthOfLongestSubstring(String s) {
int len = s.length();
// 如果长度为0则直接返回
if (len == 0) {
return 0;
}
// 设置dp
int[] dp = new int[len];
// 转成char,方便比较
char[] arr = s.toCharArray();
// 初始化dp[0]
dp[0] = 1;
int max = 1;
// 对dp的值逐个获取
for (int i = 1; i < len; i++) {
int j = i - 1;
// 与之前的子字符串进行比较
for (; j >= i - dp[i - 1]; j--) {
if (arr[j] == arr[i]) {
break;
}
}
dp[i] = i - j;
// 如果比之前所有最大子字符串还要大,则替换
if (max < dp[i]) {
max = dp[i];
}
}
return max;
}