天天看點

力扣 3. 無重複字元的最長子串一、 題目二、 示例三、 思路與代碼

一、 題目

力扣 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;
    }
};