一、 題目
力扣 3. 無重複字元的最長子串一、 題目二、 示例三、 思路與代碼 二、 示例
力扣 3. 無重複字元的最長子串一、 題目二、 示例三、 思路與代碼 三、 思路與代碼
1. 思路:
1. 采用滑動視窗算法;
2. 滑動視窗收縮的關鍵:
- 當目前移入視窗的字元其計數已經超過1時,則進行視窗的收縮;
3. 無重複子串長度更新的時機:當視窗中沒有重複字元時, 更新長度;
4. 具體見代碼解析;
2. 代碼:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
const int INT_MIN_LEN = 0;
// 滑動視窗解法
unordered_map<char, int> windows;
int left = 0;
int right = 0;
int s_len = s.size();
int ans_len = INT_MIN_LEN;
while (right < s_len) {
char c = s[right];
right++;
windows[c]++;
// 當視窗中有重複的字元時, 進行收縮, 其他的時候, 可以更新資料長度
while (windows[c] > 1) {
char d = s[left];
left++;
windows[d]--;
}
ans_len = max(right - left, ans_len);
}
return ans_len;
}
};