題目來源: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循環