给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
分析:
滑动窗口
class Solution {
private:
int max(int a, int b){
return a>b?a:b;
}
public:
int lengthOfLongestSubstring(string s) {
// 滑动窗口,并且用一个数组来保存窗口中出现的字符
// 注意这里赋初值要循环一遍
int indexs[128] = {-1}; // 滑动窗口中这个字符出现在字符串的第几个位置
for(int i=0; i<128; i++) indexs[i] = -1;
if(s.length()<2)return s.length();
int start = 0;
indexs[s[start]] = start;
int end = 1;
int maxLength = 0;
while(end < s.length()){
// 大于-1说明end这个字符出现过
if(indexs[s[end]] > -1){
if(indexs[s[end]] >= start){
start = indexs[s[end]] + 1;
}
}
// 没有出现过就加一
indexs[s[end]] = end;
end ++;
maxLength = max(maxLength, end-start);
}
// maxLength = max(maxLength, end-start);
return maxLength;
}
};