Leetcode第三題《Longest Substring Without Repeating Characters》

題目:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for 「abcabcbb」 is 「abc」, which the length is 3. For 「bbbbb」 the longest substring is 「b」, with the length of 1.數組

  意思就是:給出一個字符串,找出不包含重複字母的最長字串,輸出字符串的長度。spa

  以前我一直是暴力破解,最近看到一個有意思的思路,記錄下來。code

  先上代碼:blog

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> dict(256, -1);//ASCCI hash
        int maxLen = 0, start = -1;
        for(int i = 0; i < s.size(); ++i)
        {
            if(dict[s[i]] > start)
            {
                start = dict[s[i]];
            }
            dict[s[i]] = i;
            maxLen = max(maxLen, i-start);
        }
        return maxLen;
    }
    int max(int a, int b)
    {
        return a > b ? a : b;
    }
};

  看到這麼短的代碼,我也被其優雅所折服,咱們來看下思路:ci

  * 對字符串進行一次遍歷,用一個大小爲256(ascii最多有256種字符)數組記錄每一個字母最後一次的下標。
  * 若是當前字符在以前出現過就覆蓋原來的數組元素,而且更新start值。
  * 每次循環時檢查當前下標i-開始下標start和一個記錄當前最大串長度的max變量的關係,將max保持或更新。
  * 須要注意的是,我更新start和max是在檢測到重複字母時進行的,而最後一個字符不必定和前邊重複,因此循環外要附加一次更新max的操做。字符串

相關文章
相關標籤/搜索