📅  最后修改于: 2023-12-03 15:34:08.798000             🧑  作者: Mango
在Python中,可以使用一些简单的逻辑来查找给定字符串中最多可以包含K个不同字符的最长子字符串。
在这种方法中,使用一个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来存储字符和相应的计数,而不是使用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
总的来说,这两种方法都使用了类似的逻辑和滑窗来解决问题,区别在于存储和计数字符的方式不同。这两种方法都是可行的,但是在不同的情况下可能会有性能上的区别。