1. 程式人生 > >2018暑假第三題

2018暑假第三題

題目:

給定一個字串,找出不含有重複字元的最長子串的長度。(python)

示例:

給定 "abcabcbb" ,沒有重複字元的最長子串是 "abc" ,那麼長度就是3。

給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。

給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是一個子串"pwke" 是 子序列  而不是子串。

連結:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/

方法一:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        str1 = []
        temp = 0
        x = 0
        
        for i in range(0,len(s)):
            for j in range(i,len(s)):
                if s[j] in str1:
                    x = len(str1)
                    break
                else:
                    str1.append(s[j])
                    x = len(str1)
            if x>temp:
                temp = x
                str1 = []
            else:
                str1=[]
        return temp

本方法無法提交。。。因為後面的測試時間比較長,超時了,但是結果是對的

方法二:

https://blog.csdn.net/together_cz/article/details/77533121   這個是下面程式碼的部落格,我把他複製過來為了寫註釋

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        res_list=[]
        length=len(s)
        for i in range(length):
            tmp=s[i]
            for j in range(i+1, length):
                if s[j] not in tmp:
                    tmp+=s[j]
                else:
                    break
            res_list.append(tmp)
        res_list.sort(lambda x,y:cmp(len(x),len(y)))     //把res_list中的字串按長短排序
        res = res_list[-1]                                               //取最長的一個
        return len(res)                                                  //返回其長度

這個是我在網上找的,但是,也是提交不上去,因為res_list[-1]報錯:索引超出範圍。。。明明可以執行。好氣啊!
 

 

後來補充:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        n = len(s)
        ans = 0
        dic = {}                                //建立一個空字典
        i = 0
        for j in range(n):                 
            if s[j] in dic:
                i = max(dic.get(s[j]),i)     //若字元已存在,則將子串的開頭索引(i)向後移動
            ans = max(ans,j-i+1)        //子串長度取當前最長值
            dic[s[j]] = j+1                   //字典中鍵為字串中的字母,值為該字元索引
        return ans
    這個程式碼是我把閱讀解答裡面的java程式碼改成python了,可以提交通過。