leetcode-3-Longest Substring Without Repeating Characters

一、問題

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

Examples:

Given “abcabcbb”, the answer is “abc”, which the length is 3.

Given “bbbbb”, the answer is “b”, with the length of 1.

Given “pwwkew”, 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.

二、代碼

class Solution {
public:
    //方法一:最low方法:時間複雜度是O($n^2$)
    int lengthOfLongestSubstring(string s) {
        int i,j,k;
        int maxlength = 0;
        int thislength;
        int found;
        for(i = 0; i<s.size(); i++)
        {
            found = 0;
            for(j = i+1;j<s.size();j++)
            {
                for(k=i; k<j; k++)
                {
                    if(s[k] == s[j]) 
                    {
                        found = 1;
                        break;
                    }
                }
                if(found) break;
            }
            thislength = j-i; 
            maxlength = maxlength > thislength ? maxlength : thislength;
            if(thislength > s.size() - i -1) break;
        }
        return maxlength;
    }

    //方法二
    /*
    The previous implements all have no assumption on the charset of the string s.
    If we know that the charset is rather small, we can replace the Map with an integer array as direct access table.
    Commonly used tables are:

    int[26] for Letters 'a' - 'z' or 'A' - 'Z'
    int[128] for ASCII
    int[256] for Extended ASCII
    */
    int lengthOfLongestSubstring(string s) {
        vector<int> dict(256, -1);
        int maxLen = 0, start = -1;
        for (int i = 0; i != s.length(); i++) {
            if (dict[s[i]] > start)
                start = dict[s[i]];
            dict[s[i]] = i;
            maxLen = max(maxLen, i - start);
        }
        return maxLen;
    }

    //方法三:時間複雜度和上一種方法一樣,但是空間複雜度低一點。
    //簡單修改,使用map來實現,則是:
    int lengthOfLongestSubstring(string s) {
        map<char, int> charMap;
        int start = -1;
        int maxLen = 0;

        for (int i = 0; i < s.size(); i++) {
            if (charMap.count(s[i]) != 0) {   //由於map不包含重複的key,因此m.count(key)取值爲0或1,表示是否包含
                start = max(start, charMap[s[i]]);
            }
            charMap[s[i]] = i;
            maxLen = max(maxLen, i-start);
        }
        return maxLen;
    }
};

三、總結

不要動不動就使用for循環,很慢,換個思路,想想題目描述中未包含的信息,比如這題字符最多256個這樣。

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