leetcode刷題3.無重複字符的最長子串

題目:給定一個字符串,找出不含有重複字符的 最長子串 的長度。 示例: 給定 「abcabcbb」 ,沒有重複字符的最長子串是 「abc」 ,那麼長度就是3。 給定 「bbbbb」 ,最長的子串就是 「b」 ,長度是1。 給定 「pwwkew」 ,最長子串是 「wke」 ,長度是3。請注意答案必須是一個子串,」pwke」 是 子序列 而不是子串。html

思路: 這是一道能夠跟Two Sum媲美的題。給了咱們一個字符串,讓咱們求最長的無重複字符的子串, 注意這裏是子串,不是子序列,因此必須是連續的。咱們先不考慮代碼怎麼實現,若是給一個例子"abcabcbb", 讓你手動找無重複字符的子串,該怎麼找? 一個字符一個字符的遍歷,好比a,b,c,而後又出現了一個a,那麼此時就應該去掉第一次出現的a, 而後繼續日後,又出現了一個b,則應該去掉一次出現的b,以此類推,最終發現最長的長度爲3。 因此說,咱們須要記錄以前出現過的字符,記錄的方式有不少,最多見的是統計字符出現的個數, 可是這道題字符出現的位置很重要,因此咱們能夠使用HashMap來創建字符和其出現位置之間的映射。Python中用字典spa

參考資料 https://www.cnblogs.com/ariel-dreamland/p/8668286.htmlcode

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 存儲歷史循環中最長的子串長度
        max_len = 0
        # 判斷傳入的字符串是否爲空
        if s is None or len(s) == 0:
            return max_len
        # 定義一個字典,存儲不重複的字符和字符所在的下標
        str_dict = {}
        # 存儲每次循環中最長的子串長度
        one_max = 0
        # 記錄最近重複字符所在的位置+1
        start = 0
        for i in range(len(s)):
            # 判斷當前字符是否在字典中和當前字符的下標是否大於等於最近重複字符的所在位置
            if s[i] in str_dict and str_dict[s[i]] >= start:
                # 記錄當前字符的值+1
                start = str_dict[s[i]] + 1
            #print("start=",start)
            # 在這次循環中,最大的不重複子串的長度
            one_max = i - start + 1
            #print("one_max = ", one_max)
            # 把當前位置覆蓋字典中的位置
            str_dict[s[i]] = i
            #print("str_dict[s[%s]] = " %i, str_dict)
            # 比較這次循環的最大不重複子串長度和歷史循環最大不重複子串長度
            max_len = max(max_len, one_max)
            #print('max_len = ',max_len)
        return max_len


if __name__ == '__main__':
    sol = Solution()
    # print(sol.lengthOfLongestSubstring("bbbbb"))
    # print(sol.lengthOfLongestSubstring("eeydgwdykpv"))
    print(sol.lengthOfLongestSubstring("pwwkew"))
    # print(sol.lengthOfLongestSubstring("abcabcbb"))

例子

s = "pwwkew" 則有:htm

i 0 1 2 3 4 5
start 0 0 2 2 2 3
one_max 1 2 1 2 3 3
str_dic {‘p':0} {'p': 0, 'w': 1} {'p': 0, 'w': 2} {'p': 0, 'w': 2, 'k': 3} {'p': 0, 'w': 2, 'k': 3, 'e': 4} {'p': 0, 'w': 5, 'k': 3, 'e': 4}
max_len 1 2 2 2 3 3
相關文章
相關標籤/搜索