遊離態GLZ的LeetCode刷題筆記3

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

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

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

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

示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。

請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。

題目解法

首先思考,本題如果沒有重複字符,那麼皆大歡喜,直接輸出字符串長度即可。問題就出現在了重複的字符串身上。我們所要考慮的就是,當出現重複字符時,我們讓哪一個字符“存在”於我們的子串中,能夠讓字串長度最大。
因此,我們只需要維護頭尾兩個指針,指向可能的最長子串的頭尾。每次移動指針都判斷一下當前長度有沒有超過已知的最長長度,超過了則更新最長長度。
具體更新方法:用hash表存儲當前子串中出現的字符,尾節點遍歷字符串,判斷尾節點字符是否出現過。如果出現了,則將頭結點移動到尾節點字符在子串出現位置的後一個,並且消除hash表中由於移動頭結點而不復存在於子串中的字符記錄。

代碼

本題採用c++

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        bool hashmap[256];
        for(int i = 0; i < 256;i++)
        {
            hashmap[i] = 0;
        }
        int tail = 0,head = 0;
        int max_len = -1;
        for(tail = 0; tail < s.length();tail++)
        {
            if(tail - head + 1 > max_len)
            {
                max_len = tail - head;
            }
            if(hashmap[int(s[tail])])
            {
                while(s[head] != s[tail])
                {
                    hashmap[int(s[head])] = 0;
                    head++;
                }
                head++;
            }
            hashmap[int(s[tail])] = 1;
        }
        if(tail - head  > max_len)
        {
            max_len = tail - head;
        }
        return max_len;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章