1. 程式人生 > >leetcode 3. 無重複字元的最長子串(python)

leetcode 3. 無重複字元的最長子串(python)

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

示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 無重複字元的最長子串是 "abc",其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 無重複字元的最長子串是 "b",其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 無重複字元的最長子串是 "wke",其長度為 3。
     請注意,答案必須是一個子串"pwke" 是一個子序列 而不是子串。

程式碼一:

方法:先求出每一個元素的下標,然後在對相同元素的不同下角標分類討論。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        record_place = {}
        max_len = 0
        mid_max_len = 0
        for (i, ch) in enumerate(s):
            if ch not in record_place:
                mid_max_len += 1
                if max_len < mid_max_len:
                    max_len = mid_max_len
            else:
                if i - record_place[ch] > mid_max_len:
                    mid_max_len += 1
                    if mid_max_len > max_len:
                        max_len = mid_max_len
                else:
                    mid_max_len = i - record_place[ch]

            record_place[ch] = i
        return max_len

程式碼二:

方法:滑動視窗,普通的滑動視窗不能過,所以在快速記錄左側視窗即可。程式碼如下 

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        temp = 0
        d = {}
        start = 0 
        for i in range(len(s)):
            if s[i] in d and start <= d[s[i]] :
                start = d[s[i]] +1
            temp = max(i-start+1,temp)
            d[s[i]] = i
        return temp