關於leetcode第三題的巧妙解法

  最近在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.

  思路實際上是十分巧妙的,我們事先建立一個數組,用來記錄所有字符的出現位置,初試的時候因爲我們計數肯定是從第一個字符開始,第一個字符的下標爲0,那麼我們就就將先將初試的時候各個字符出現的位置設置成-1,那麼我們首先從第一個字符開始往後計數,每次發現一個字符就就這個字符出現的位置改成現在的位置,這個時候我們開始計數的位置還是0,一旦我們往後不斷更新最大的不重複子字符串的長度的時候,第一個重複的字符出現了,那麼這個時候我們就要更新開始的位置了,因爲什麼呢,因爲我們的字符串裏不能包含兩個相同的字符,因此這個時候只有兩種選擇:一種是起點選在原來的起點,重點選在兩個重複的字符之間,這種情況顯然我們已經考慮過了,因此這個時候要做的就是將字符開始的位置搬運到這個重複字符第一次出現的位置之後的那個位置上就可以了。而我們怎麼更新這個字符最新出現的位置呢?在一次循環的最後更新就可以了,非常的巧妙。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int locs[256];//保存字符上一次出現的位置
        memset(locs, -1, sizeof(locs));

        int idx = -1, max = 0;//idx爲當前子串的開始位置-1
        for (int i = 0; i < s.size(); i++)
        {
            if (locs[s[i]] > idx)//如果當前字符出現過,那麼當前子串的起始位置爲這個字符上一次出現的位置+1
            {
                idx = locs[s[i]];
            }

            if (i - idx > max)
            {
                max = i - idx;
            }

            locs[s[i]] = i;
        }
        return max;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章