【发布时间】: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' 我希望声明是明确的,至少我试过了,`因为英语不是我的母语。
不知道如何为这个问题设计算法。我应该使用二进制搜索作为答案技术,就像从任务的陈述中看到的那样。
首先要做的事情:我至少尝试在解决这个问题的方式上发展我的想法,所以它是:
- 找到中间,我们将字符串从0到mid+1和mid到n分别切成两段。 (我用 Python 编写代码,所以我认为在这里使用切片是很自然的)
- 查找唯一字符的数量(我使用了 len(set(slice)))并比较:如果 1-st(左)切片的数量更大,则我们将右 = 中,否则为左
- 所有这些指令都放在“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