「LeetCode Top100」之滑動視窗

云雀AC了一整天發表於2024-08-11

3. 無重複字元的最長子串

題目連結:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked
題目難度:中等
標籤:雜湊表字串滑動視窗
題目狀態:學習題解

思路:

滑動視窗的思路,也就是維持一個無序佇列unordered_set<char>用來當作這個視窗。

  • 遍歷字串,若當前字元不在視窗中,就將該字元insert進視窗中,然後將長度加1。
  • 若當前字元在視窗中,就將視窗的左側元素移除,這樣就實現了移動這個視窗。然後判斷當前的子串長度是否大於之前的長度。

當遍歷結束,就獲得了子串的最大長度。

程式碼:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() == 0) return 0;
        unordered_set<char> window;
        int maxStr = 0;
        int left = 0;
        for(int i = 0; i < s.size(); ++i) {
            while(window.find(s[i]) != window.end()) {
                window.erase(s[left]);
                left++;
            }
            maxStr = max(maxStr, i - left + 1);
            window.insert(s[i]);
        }
        return maxStr;
    }
};

438. 找到字串中所有字母異位詞

題目連結:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked
題目難度:中等
標籤:雜湊表字串滑動視窗
題目狀態:學習題解

思路:

這題使用滑動視窗解決,滑動視窗的大小是p的大小。然後建立兩個26位的陣列,pCount和sCount,其中pCount儲存p的字母狀態,這個是固定的,用來與sCount進行比較的。sCount中儲存的是當前滑動視窗裡面的s的字母狀態。若pCount和sCount相等,則壓入結果陣列中。

程式碼:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.size(), pLen = p.size();
        if(sLen < pLen) return vector<int>();
        
        vector<int> ans;
        vector<int> sCount(26);
        vector<int> pCount(26);
        for(int i = 0; i < pLen; ++i) {
            ++sCount[s[i] - 'a'];
            ++pCount[p[i] - 'a'];
        }

        if(sCount == pCount) ans.emplace_back(0);

        for(int i = 0; i < sLen - pLen; ++i) {
            --sCount[s[i] - 'a'];
            ++sCount[s[i + pLen] - 'a'];

            if(sCount == pCount) ans.emplace_back(i + 1);
        }
        return ans;
    }
};

相關文章