题目描述
给定一个字符串,找出其中不含有重复字符的 最长子串 的长度。
示例
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
理解的关键在于子串必须是连续的,常用思想为滑动窗口
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//left为窗口左边界
int left = 0,res = 0;
int m[256] = {0};
for(int i = 0;i < s.size();++i){
if(m[ s [i] ] == 0 || m[ s [i] ] < left){ //字符从未出现过或出现但不在当前窗口内
res = max(res,i - left + 1); //若当前窗口长度大于之前结果,更新res
}
else{
left = m[ s [i] ] ; //更新左边界
}
m[ s [i] ] = i + 1; //将当前字符最后出现的位置更新为其右边
}
return res;
}
};
用m[256]作为存储字符最后出现的位置右边(因为ASCII码总共能表示256个字符).