3. Longest Substring Without Repeating Characters 無重復字符的最長子串

題目鏈接
tag:

  • Medium;

question:
??Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.

Example 2:

Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

Example 3:

Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

思路:
??給了一個字符串,讓求最長的無重復字符的子串,注意這里是子串,不是子序列,所以必須是連續(xù)的。我們先不考慮代碼怎么實現(xiàn),拿Example1中的例子"abcabcbb",該怎么找。博主會一個字符一個字符的遍歷,比如a,b,c,然后又出現(xiàn)了一個a,那么此時就應該去掉第一次出現(xiàn)的a,然后繼續(xù)往后,又出現(xiàn)了一個b,則應該去掉一次出現(xiàn)的b,以此類推,最終發(fā)現(xiàn)最長的長度為3。所以說,我們需要記錄之前出現(xiàn)過的字符,記錄的方式有很多,最常見的是統(tǒng)計字符出現(xiàn)的個數(shù),但是這道題字符出現(xiàn)的位置很重要,所以我們可以使用HashMap來建立字符和其出現(xiàn)位置之間的映射。進一步考慮,由于字符會重復出現(xiàn),到底是保存所有出現(xiàn)的位置呢,還是只記錄一個位置?我們之前手動推導的方法實際上是維護了一個滑動窗口,窗口內(nèi)的都是沒有重復的字符,我們需要盡可能的擴大窗口的大小。由于窗口在不停向右滑動,所以我們只關心每個字符最后出現(xiàn)的位置,并建立映射。窗口的右邊界就是當前遍歷到的字符的位置,為了求出窗口的大小,我們需要一個變量left來指向滑動窗口的左邊界,這樣那么就分兩種情況,在或不在滑動窗口內(nèi),如果不在滑動窗口內(nèi),那么就沒事,當前字符可以加進來,如果在的話,就需要先在滑動窗口內(nèi)去掉這個已經(jīng)出現(xiàn)過的字符了,去掉的方法并不需要將左邊界left一位一位向右遍歷查找,由于我們的HashMap已經(jīng)保存了該重復字符最后出現(xiàn)的位置,所以直接移動left指針就可以了。我們維護一個結果res,每次用出現(xiàn)過的窗口大小來更新結果res,就可以得到最終結果啦。AC代碼如下:

C++ 解法:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() < 2)
            return s.size();
        unordered_map<char, int> m;
        int max_len = 0, left = -1;
        for (int i=0; i<s.size(); ++i) {
            if (m.count(s[i]) && m[s[i]] > left)
                left = m[s[i]];
            m[s[i]] = i;
            max_len = max(max_len, i-left);
        }
        return max_len;
    }
};

Python 解法:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s) < 2:
            return len(s)
        d = {}
        left = -1
        max_len = 0
        for i in range(len(s)):
            if s[i] in d and d[s[i]] > left:
                left = d[s[i]]
            d[s[i]] = i
            max_len = max(max_len, i-left)
        return max_len
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容