📜  Python – 最大 K 长度的字符串(1)

📅  最后修改于: 2023-12-03 15:34:08.798000             🧑  作者: Mango

Python – 最大 K 长度的字符串

在Python中,可以使用一些简单的逻辑来查找给定字符串中最多可以包含K个不同字符的最长子字符串。

方法一: Set和Sliding Window

在这种方法中,使用一个set存储当前子字符串中包含的字符。使用两个指针,start和end,来标识滑动窗口的左右边界。当set中的元素数量大于K时,start向右移动,删除set中最左边的元素。每个新的end位置都添加到set中。在每个位置保存最长的子字符串并在后续迭代中返回。

def find_longest_string(s:str, k:int) -> str:
  
    n = len(s)
    freq = Counter()

    left, right = 0, 0
    max_len = 1
    max_string = s[0]

    while right < n:
        
        freq[s[right]] += 1
        right += 1

        # Keep reducing the window size to fulfill our conditions
        while len(freq) > k:

            freq[s[left]] -= 1
            
            if freq[s[left]] == 0:
                del freq[s[left]]
            
            left += 1
            
        if right - left > max_len:
            max_len = right - left
            max_string = s[left:right]

    return max_string
方法二: Map和 Sliding Window

另一种方法是使用Map来存储字符和相应的计数,而不是使用Set。然后在窗口中使用两个变量来持久存储当前最长的子字符串。在迭代期间,更新字符计数并添加到窗口变量中。如果包含的字符数量大于K,则需要更新窗口的左边界。

def find_longest_string(s:str, k:int) -> str:
    
    mp = defaultdict(int)
    n = len(s)
    j, res = 0, ""
    cnt = 0

    for i in range(n):
        mp[s[i]] += 1

        if mp[s[i]] == 1:
            cnt += 1

        while cnt > k:
            mp[s[j]] -= 1
            if mp[s[j]] == 0:
                cnt -= 1
            j += 1

        if i-j+1 > len(res):
            res = s[j:i+1]

    return res

总的来说,这两种方法都使用了类似的逻辑和滑窗来解决问题,区别在于存储和计数字符的方式不同。这两种方法都是可行的,但是在不同的情况下可能会有性能上的区别。