美文网首页北美程序员面试干货
LeetCode 340 [Longest Substring

LeetCode 340 [Longest Substring

作者: Jason_Yuan | 来源:发表于2016-08-08 13:26 被阅读242次

原题

给定一个字符串,找到最多有k个不同字符的最长子字符串。

样例
例如,给定 s = "eceba" , k = 3,
T 是 "eceb",长度为 4.

解题思路

  • 找子串 - 窗口问题
  • 如果套用通常的if+while模板,里面需要考虑几种Corner Case
  • len(s) < k - 可以直接返回s的长度
  • 跳出循环是因为len(sourceHash) > k - 那其实一定就等于 k + 1,此时如果符合条件,则更新length
  • 跳出循环是因为right = len(s) - 举例"abababbaba" k = 3的情况,此时如果符合条件,更新length

完整代码

class Solution:
    # @param s : A string
    # @return : An integer
    def lengthOfLongestSubstringKDistinct(self, s, k):
        # write your code here
        if not s or not k:
            return 0
        if len(s) < k:
            return len(s)
        right, length = 0, 0
        sourceHash = {}
        for left in range(len(s)):
            while len(sourceHash) <= k and right < len(s):
                if s[right] not in sourceHash:
                    sourceHash[s[right]] = 1
                else:
                    sourceHash[s[right]] += 1
                right += 1
            if len(sourceHash) == k + 1 and right - left - 1 > length:
                length = right - left - 1
            elif right >= len(s) and right - left > length:
                length = right - left
                
            sourceHash[s[left]] -= 1
            if sourceHash[s[left]] == 0:
                del sourceHash[s[left]]
        
        return length

相关文章

网友评论

    本文标题:LeetCode 340 [Longest Substring

    本文链接:https://www.haomeiwen.com/subject/ivulsttx.html