LeetCode:Longest Substring Without Repeating Characters(最長不重複子串)

題目連接html

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.數組


推薦參考博客:最長不重複子串code

 

注意:輸入空串時,返回0htm

以abcdbefdhij 爲例:blog

image

圖中的start是一個標誌位,表示當前不重複子串的起始位置,圖中的數字表示記錄字符出現位置的數組hashtable,好比字符b出如今第1位,那麼hashtable[‘b’]=1。                              本文地址ip

順序掃描字符串,第4個位置時,在hashtable中發現b已經出現過(記出現的位置爲k,此時k=1),那麼當前的不重複子串長度 = 當前位置-start;下一個不重複子串就應該從第k+1個字符(2號位的c)開始,即令start = 2,而且把[start, k)位置的字符對應的hashtable清空,從新設置b在hashtable的位置爲4。繼續掃描直到再次發現相同的字符,和前面同樣處理。注意所有處理完字符串,還要判斷一下末尾的不重複子串是不是最長的。leetcode

時間複雜度分析:最壞狀況下,至關於遍歷了兩遍字符串,所以時間複雜度是O(n)字符串

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> bitmap(128, -1);
        int res = 0;
        int start = 0, lastStart = 0;
        for(int i = 0; i < s.size(); i++)
        {
            if(bitmap[s[i]] != -1)
            {
                res = max(res, i-start);
                lastStart = start;
                start = bitmap[s[i]] + 1;
                for(int j = lastStart; j < bitmap[s[i]]; j++)
                    bitmap[s[j]] = -1;
            }
            bitmap[s[i]] = i;
        }
        res = max(res, (int)s.size()-start);//不要忘了最後的判斷
        return res;
    }
};

 

【版權聲明】轉載請註明出處:http://www.cnblogs.com/TenosDoIt/p/3736725.htmlget

相關文章
相關標籤/搜索