【问题标题】:Find the length of longest substring with at most K repeating characters找出最多包含 K 个重复字符的最长子串的长度
【发布时间】:2020-11-08 14:27:29
【问题描述】:

问题:给定整数 n, k (1 输入: 6, 2 'abbbaa' output: 4 3 //这里,4是最大长度,3是子字符串'bbaa'的第一个元素在原始字符串中的位置。所以这里每个字符重复k次,就OK了

输入:3, 1 'abb' output: 2, 1 //是的,需要的子字符串是'ab' 我希望声明是明确的,至少我试过了,`因为英语不是我的母语。

不知道如何为这个问题设计算法。我应该使用二进制搜索作为答案技术,就像从任务的陈述中看到的那样。

首先要做的事情:我至少尝试在解决这个问题的方式上发展我的想法,所以它是:

  1. 找到中间,我们将字符串从0到mid+1和mid到n分别切成两段。 (我用 Python 编写代码,所以我认为在这里使用切片是很自然的)
  2. 查找唯一字符的数量(我使用了 len(set(slice)))并比较:如果 1-st(左)切片的数量更大,则我们将右 = 中,否则为左
  3. 所有这些指令都放在“while right > left + 1”循环中。

到目前为止一切都很好,但可能我错过了某事,或者这个想法不是一个有效的方法来获取子字符串的第一个元素的位置,查看它在给定字符串中的位置。

代码(Python 3):使用 binsearch 查找第一个元素的位置

n, k = map(int, input().split())
s = input()
left = 0
right = n - 1

while (right > left + 1):
    mid = (left + right) // 2
    char1 = len(set(s[0:mid+1]))
    char2 = len(set(s[mid:n]))
    if char1 >= char2:
        right = mid
    else:
        left = mid
print(left + 1)

无需 bin.search 即可查找最长子字符串长度的代码(我认为这会更容易,而且工作正常,虽然方法很幼稚)

n, k = map(int, input().split())
s = input()
letters = [0] * 26
max_len = 0
for i in range(len(s)):
    letters[ord(s[i]) - ord('a')] = letters[ord(s[i]) - ord('a')] + 1
for i in range(0, 26):
    if letters[i] >= k:
        max_len = max_len + k
    else:
        max_len = max_len + letters[i]
print(max_len)

【问题讨论】:

    标签: python string algorithm binary-search


    【解决方案1】:

    你的方法很贪心,不会得到正确的结果。考虑输入 4 4 ccab - 您的二进制搜索代码将返回 2,但它应该返回 1(整个字符串都很好)。要解决此问题,您可以使用称为两个指针的方法。我们将两个指针 a 和 b 定义为我们当前正在考虑的子字符串的开始和结束。我们还需要记住当前子字符串中每个字母出现的次数。首先,将 a 和 b 设置为 0。然后尝试通过将当前子字符串的末尾移动 1 (b=b+1) 来扩展当前子字符串,并且在我们这样做的同时将字母 s[b] 的出现次数增加 1。如果这个数字超过 K 这意味着我们当前的字符串不再有效。为了使它再次有效,我们需要将它的开始移动到子字符串 (a, b) 的所有字母出现少于或恰好 K 次的点。为此,我们只需将 a 增加 1 并减少 oc[s[a]] 直到 oc[s[b]] max_len,如果是,则将 max_len 设置为 b-a+1,将开头设置为 a。

    n, k = map(int, input().split())
    s = input()
    a = 0
    oc = [0]*26
    max_len = 0
    first = -1
    
    for b in range(0, n):
        oc[ord(s[b])-ord('a')]+=1
        while(oc[ord(s[b])-ord('a')]>k):
            oc[ord(s[a])-ord('a')]-=1
            a+=1
        if b-a+1>max_len:
            max_len=b-a+1
            first=a+1
    
    print(first)
    print(max_len)
    

    oc 是我们在子字符串中存储出现的字母的数组。

    【讨论】:

      猜你喜欢
      • 2020-01-19
      • 2016-08-11
      • 1970-01-01
      • 2017-03-15
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2017-05-22
      相关资源
      最近更新 更多