LeetCode(No.3)--无重复字符的最长子串

给定一个字符串,找出不含有重复字符的最长子串的长度。

示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,“pwke” 是 子序列 而不是子串。

  • 思路: 利用字典和一个中间变量,将字符串中的字符逐个加入到字典里,如果字典中已经未存在改字符,则key为字符,value为对应下标,且中间变量值加1;若已存在,则更新value为新下标,如果两个相同字符之间的下标差大于中间变量,则中间变量加1
class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        # 定义一个字典和初始化最大子串长度和中间变量长度为0
        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:
	            # 比较两个相同字符之间的长度是否大于中间变量,
	            # 是则中间变量加1,否则中间变量为俩字符间长度
                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

leetcode上最优的解法是利用hashTable来处理,代码如下:

class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        hashTable = {}
        max_len = 0
        cur = 0

        for i, c in enumerate(s):
            if c in hashTable and cur <= hashTable[c]:
                print(c, hashTable[c])
                cur = hashTable[c] + 1
            else:
                max_len = max(max_len, i - cur + 1)
            hashTable[c] = i

         return max_len

你可能感兴趣的:(LeetCode)