leetcode003 Longest Substring Without Repeating Characters

題目

3. 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.

第一次提交(失敗)

總結

我想利用LinkedHashMap的特性(保持原來的順序存儲不重複的元素)來解決問題,但是這樣的話會有各種特殊情況,比如在我下面帖出的代碼中輸入“tdmmgekoat”,正確結果應爲7,但是輸出卻爲6,原因爲Map在插入最後一個元素t的時候會覆蓋掉第一個t,從而導致數據出現錯誤。但是利用HashMap確實能解決此題(HashSet也行)點擊這是查看

第一次提交代碼:

    //下面是錯誤的代碼,看看就好,不要參考!!!
    public int lengthOfLongestSubstring(String s)
    {
        LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
        int length = 0;
        int tmp;
        int lose = 0;
        int tmp1 = 0;
        for(int i = 0, j = 0; i < s.length();i++)
        {
            if(map.containsKey(s.charAt(i)))
                tmp1 = map.put(s.charAt(i),i);
            else
                map.put(s.charAt(i),i);
            tmp = i-j+1;
            if(tmp1 > j && map.size()-lose != tmp)
            {
                if(length < tmp-1)
                {
                    length = tmp-1;
                }
                j = tmp1+1;
                lose = j-1;
            }else if(tmp > length)
                length = tmp;
        }

        return length;
    }

第二次提交

第二次提交代碼:

    public int lengthOfLongestSubstring(String s)
    {
        if(s.length() == 0)
            return 0;
        if(s.length() == 1)
            return 1;
        int length = s.length();
        char[] sToChars = s.toCharArray();
        int[] tmp = new int[128];
        int i = 0, j =0;

        int maxSubLength = 0;
        int index;
        while(i < length)
        {
            if(tmp[sToChars[i]] == 0)
            {
                tmp[sToChars[i]] = ++i;
                if(i - j > maxSubLength)
                    maxSubLength = i-j;
            }else
            {
                index = tmp[sToChars[i]];
                tmp[sToChars[i]]=0;
                if(j < index)
                    j = index;
            }
        }

        return maxSubLength;
    }

第二次結果細節(圖):

image

第二次提交總結:

改變思路後,果然順利了許多。第二次的思路:利用一個數組tmp來存儲每個字符出現的位置,而在這個數組存儲時以字符的ASCII作爲下標。若字符是首次出現,則在tmp數組對應的位置記錄下它原來所在的位置,若不是第一次出現,則先取出原來的數據再覆蓋。注意:先把String轉成字符數組再操作(利用String的toCharArray()方法),效率會高很多。

發佈了44 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章