LC 2953. 统计完全子字符串
https://leetcode.cn/problems/count-complete-substrings/description/
这里也是看 题解 才知道的,第二个条件比较好处理,主要是第一个条件。没有想到可以通过枚举所有可能重复字符的个数来求解:确定可能重复字符的个数,那么就变成滑动窗口了。在判断是否满足条件的时候,需要在in/out (0,k)两个地方稍微记录一下,这样就可以快速判断是否满足条件。
class Solution:
def countCompleteSubstrings(self, word: str, k: int) -> int:
def f(s):
res = 0
for m in range(1, 27):
if k * m > len(word):
break
cnt = [0] * 26
cat = m
for i in range(len(s)):
j = i - (k * m)
if j >= 0:
cnt[s[j]] -= 1
now = cnt[s[j]]
if (now + 1) in (0, k):
cat -= 1
if now in (0, k):
cat += 1
cnt[s[i]] += 1
if True:
now = cnt[s[i]]
if (now - 1) in (0, k):
cat -= 1
if now in (0, k):
cat += 1
if (i + 1) >= k * m and cat == m:
res += 1
return res
ss = [ord(x) - ord('a') for x in word]
ans = 0
j = 0
for i in range(len(ss)):
if i > 0 and abs(ss[i] - ss[i - 1]) > 2:
ans += f(ss[j:i])
j = i
ans += f(ss[j:])
return ans