classSolution{public:intlengthOfLongestSubstring(string s){int l =0, r =-1;//左右指针
vector<int>freq(256,0);//记录滑动窗口中的字符int res;//返回结果,记录子串长度while(l < s.size()){//预先判断:r+1位置的字符是否出现在滑动窗口中if(r +1< s.size()&& freq[s[r +1]]==0) freq[s[++r]]++;else freq[s[l++]]--;//从滑动窗口中去除s[l],也就是最左端的字符
res =max(res, r - l +1);}return res;}};
写法二:(其实是双指针法)
classSolution{public:intlengthOfLongestSubstring(string s){
vector<int>freq(256,0);int res =0;for(int i =0, j =0; i < s.size(); i++){
freq[s[i]]++;/*
while (freq[s[i]] > 1) {
freq[s[j]]--;
j++;
}*/while(freq[s[i]]>1) freq[s[j++]]--;
res =max(res, i - j +1);}return res;}};
贴一下写法二的通过情况:哈哈哈!!
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8 MB, 在所有 C++ 提交中击败了74.61%的用户
通过测试用例:
987 / 987