力扣HOT100之滑动窗口:3. 无重复字符的最长子串
看到这道题的时候立马想起来用哈希表来辅助答题,但是滑动窗口的具体实施细节忘完了,结果又去看灵神的题解,这里把详细思路说一下。
首先我们需要定义一个哈希表,用于存储子串中的各个字符的数量,这里我使用的是unordered_map
类型,然后我们需要定义左右指针,分别指向窗口的左端元素和右端元素,在初始状态下,左指针和右指针指向同一个元素(字符串s的第一个字符),然后使用一个for循环来移动右指针,只要右指针指向的字符在子串中的个数<=1
,就不断将右指针右移,并且更新最长无重复子串的长度,如果遇到right指针指向的字符在子串中的数量>1
,则说明已经出现了重复字符,则通过一个while
循环来将左指针右移,并同时将左指针指向的字符数量-1,当左指针遍历到重复字符时,先将该字符的数量-1,再将左指针右移一位,此时子串中不再包含重复字符,退出while
循环,并且更新最长无重复子串的长度。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length = s.size(); //输入字符串的长度
int result = 0; //用于维护最长无重复子字符串的长度
unordered_map<char, int> hash;
for(int left = 0, right = 0; right < length; right++){
hash[s[right]]++; //统计当前遍历到的字符的个数
while(hash[s[right]] > 1){ //只有出现重复字符(一定是right右移一位才出现的)时才会触发
//此时需要不断将左指针右移来缩小滑动窗口,以剔除重复字符
hash[s[left]]--;
left++;
}
//执行到此处,不管上面的while循环有没有触发,此时的子串一定不含重复字符
//此时应该统计最新结果
result = max(result, right - left + 1);
}
return result;
}
};