📅  最后修改于: 2023-12-03 15:09:55.753000             🧑  作者: Mango
给定一个字符串和一个字符k,求该字符串中恰好包含k次给定字符的子字符串的数量。
暴力枚举所有子字符串,统计其中包含k个给定字符的数量。
时间复杂度:O(n^3)
代码如下:
def count_k_substring(s: str, k: str) -> int:
count = 0
n = len(s)
for i in range(n):
for j in range(i+1, n+1):
if s[i:j].count(k) == k:
count += 1
return count
用一个窗口滑动遍历字符串,通过维护窗口内包含k个给定字符的数量,来计算恰好包含k次给定字符的子字符串的数量。
时间复杂度:O(n)
代码如下:
def count_k_substring(s: str, k: str) -> int:
count = 0
n = len(s)
left = right = 0
k_count = 0
while right < n:
if s[right] == k:
k_count += 1
while k_count > k:
if s[left] == k:
k_count -= 1
left += 1
if k_count == k:
count += 1
right += 1
return count
以上两种方法均可解决问题,但是时间复杂度存在较大差距。因此,我们可以使用滑动窗口的方法来获得更优的时间效率。