Leetcode[字串] 3. 無重複字元的最長子串 10行極簡寫法!

kev_gogo發表於2020-11-11

Leetcode[字串] 3. 無重複字元的最長子串 10行極簡寫法!

審題

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

示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

之前在陣列部分做了幾道雙指標,在這道題上其思想一樣適用,如果有讀者之前沒有了解過雙指標的話,可以參考這篇部落格 >>>戳這裡不看其實也沒事。核心思想就是利用兩個指標代替兩層迴圈,從而降低一個冪次的複雜度,也有說法管這個叫移動視窗。

程式碼實現

瞭解了雙指標後,我們寫偽碼如下:
當尾指標沒到邊界:
檢查map裡有尾指標指向元素的值是否為零:
是:尾指標元素入map,尾指標++,cnt++,更新max
否:頭指標加加,頭元素- -,cnt- -

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maximum=0, front=0, rear=0, cnt=0;
        map<char,int> m;
        while ( rear != s.size() ) {
            if ( m[s[rear]] == 0 ) {
                m[s[rear]]++; rear++; cnt++;
                if ( cnt>maximum ) maximum = cnt;
            } else {
                m[s[front]]--; front++; cnt--;
            }
        }
        return maximum;
    }
};

反思

較基礎的雙指標應用,應熟練掌握。

相關文章