1、题目来源
2、题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
3、题解分享
class Solution {
public int lengthOfLongestSubstring(String s) {
// 思路:滑动窗口 + 使用数组来记录每个字符最后(指遍历过的位置,而不是整个字符串)出现的位置。
int ans = 0;
int left = 0,right = 0;
int[] tab = new int[128];// 记录每个字符出现的最后位置
char[] chars = s.toCharArray();
int n = s.length();
// 初始化为-1,因为0也是某个字符的位置
for(int i = 0;i<128;++i){
tab[i] = -1;
}
while(right < n){
char c = chars[right];
if(tab[c] != -1){// 当窗口内这个字符重复时
ans = Math.max(ans,right - left);
if(left < tab[c] +1){// 防止左指针往回跑
left = tab[c] + 1;
}
}
tab[c] = right;//记录字符出现的最后的位置
++right;
}
ans = Math.max(ans,right - left);
return ans;
}
}
PS:当依次递增地枚举子串的起始位置时,如果子串的结束位置也是递增,那么可以使用滑动窗口来解题。