[LeetCode] 3. 無重複字符的最長子串(雙指針)

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

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

在這裏插入圖片描述
解題思路: 一般看到字符串子串問題,我們會想到用雙指針解,看到字符串子序列問題,會想到用動態規劃解,i.e.,子串問題雙指針,子序列問題動態規劃。 此題也不例外,利用雙指針解,很快即可解題,主要的思路是,維護一個hashmap統計雙指針頁框內字符的頻數,雙指針(i和j)初始化狀態均位於左側,每次指針j向右移動一個位置,然後check這個位置的字符在頁框內出現的頻數超過1,若是則通過右移指針i使得頻數降爲1,雙指針在移動的過程中記錄子串最大長度。

// 雙指針,兩個指針(i,j)一開始均位於左側,指針j每次向右移動一個
// 若發現某個字符頻數超過1,則右移指針i,直至頻數爲1,遍歷的過程中
// 記錄子串最大長度
// Time:接近O(n), space:O(n)(最壞))
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.empty()) return 0;
        int i = 0, j = 0, n = s.size(), res = 0;
        unordered_map<char, int> mp;
        while (j < n) {
            ++mp[s[j]];
            while (i <= j && mp[s[j]] > 1) {
                --mp[s[i]];
                ++i;
            }
            res = max(res, j - i + 1);
            ++j;
        }
        return res;
    }
};                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

————————————

雙指針用法小結:

雙指針解法按雙指針位置分,一般有兩種,即雙指針同向移動(e.g.,初始狀態均位於左側,隨後向右側移動),雙指針相向移動(e.g.,初始狀態一個指針在左側,另一個指針右側,隨後兩個指針向中間移動)

雙指針解法的難點是,如何判斷當移動指針時,是哪個指針移動。

考慮清楚上面兩個問題後,雙指針解題就不難了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章