题目:
利用unordered_set<char> lookup; 数据结构哈希集合;滑动窗口的方式;设定左指针和右指针,利用unodered_set中的erase() insert() count()方法,右指针移动的条件是右指针下一指向的字母没有出现在哈希集合中,左指针在移动时会erase(s[left - 1]);即从哈希集合中删除左指针之前指向的那个字母,把左指针同时当作for 循环的计数器,实现左指针的不断右移。
count()方法用于判定某个元素在哈希集合中出现过几次。比如从这句话可以看出 s[i] 这个元素在lookup中出现过五次。我们在此用于判断字符是否在哈希集合中出现过。
int cnt = lookup.count(s[i]) ;//cnt = 5;
/*
lookup.count(s[i]) 是一种在 unordered_set 中查找特定元素的方式。
它返回一个整数值,表示特定元素在集合中的出现次数。
*/
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> lookup;
int len = s.length();
int left = 0;int right = 0;
int maxlen = 0;int curlen;
lookup.insert(s[left]);
for(left;left<len;left++){
if(left!=0) lookup.erase(s[left-1]);
//左指针向右移动时,抹去之前的字符
while(right+1<len&&!(lookup.count(s[right+1]))){
//右指针没有到达最右边且下一个字符没有出现过
right++;
lookup.insert(s[right]);
}
curlen = right + 1 - left;
maxlen = max(maxlen,curlen);
}
//cout<<"left = "<<left<<"right ="<<right<<endl;
return maxlen;
}
};
之前没有接触过滑动窗口,之前遇到都想暴力,结果解不出来,现在有更好的解法了。