无重复字符的最长子串,leetCode热题100,C++实现
题目来源:leetCode
3. 无重复字符的最长子串 - 力扣(LeetCode)
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串 的长度。
解法
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> charSet; // 存储当前窗口内的字符int left = 0; // 窗口左边界int maxLength = 0; // 记录最大长度// 右指针遍历整个字符串for (int right = 0; right < s.size(); right++) {// 当发现重复字符且窗口大小至少为2时,收缩左边界while (left < right && charSet.count(s[right]) > 0) {charSet.erase(s[left]); // 移除左边界字符left++; // 左指针右移}// 将当前字符加入窗口charSet.insert(s[right]);// 更新最大长度maxLength = max(maxLength, right - left + 1);}return maxLength;}
};
采用滑动窗口法,我们有一个left和一个right指针,表示窗口的两个边界,我们不断的移动right指针,当遇到重复元素时,开始移动left指针,直到left指针移动到重复元素的下一个位置为止
比如abcdaeft,其实left和right都指向a,然后right不断移动,当right指向第二个a时,开始移动left,left会指向b,此时就没有重复元素了
left < right && charSet.count(s[right]) > 0
核心代码是这一块,left<right可以保证窗口大小至少为2,如果left==right,则窗口只有一个字符,不重复,也不会进入while循环
count可以看做是find,会返回元素出现的次数,也就是有重复时才会进入while循环