给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
// "pwwkew"
public static int lengthOfLongestSubstring(char[] chars) {
// 要进行分步解析 1、char[]总共的长度是 pwwkew
int size, i = 0, j, k, max = 0;
// size=6 总共要循环6次
size = chars.length;
// 第一次 size=6 j=0 k=0 max=0
for (j = 0; j < size; j++) {
// 第一次 k=i=0 j=0 直接走下面的if
// 第二次 k=i=0 j=1 进入循环
// 第三次 k=i=0 j=2 进入循环
// 第四次 k=i=2 j=3 直接走下面的if
// 第五次 k=i=2 j=4 进入循环
for (k = i; k < j; k++) {
// 第二次 chars[0]=p==chars[1]=w false 直接跳过
// 第三次 chars[0]=p==chars[2]=w false 直接跳过 chars[1]=w==chars[2]=w true 进入
// 第四次 chars[2]=w==chars[3]=k false 直接跳过
// 第五次 chars[2]=w==chars[4]=e false 直接跳过 chars[3]=k==chars[4]=e 直接跳过
if (chars[k] == chars[j]) {
// 第三次 i=2
i = k + 1;
break;
}
}
// 第一次 j=i=0 max=0
// 第二次 j=1 i=0 > max=1
// 第三次 j=2 i=0 max =1
// 第四次 j=3 i=2 max =2 直接跳过
// 第五次 j=4 i=2 max =2 进入
if (j - i + 1 > max) {
// 第一次 max=1
// 第二次 max=2
// 第三次 j=3 i=2 max =2
// 第五次 j=4 i=2 max =3
max = j - i + 1;
}
}
return max;
}