会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员,或
购买
该题目所属题库
,可解锁完整内容。
解题思路
这是「无重复字符最长子串」的计数变种:统计长度至少为 k、且内部字符互不相同的连续子串个数。用滑动窗口。
- 维护当前无重复窗口 [left,right]。右端每加入一个字符,若与窗口内字符重复,就把 left 推到该字符上次出现位置的右边。
- 此时所有 s[start..right](left≤start≤right)都不含重复字符。
- 其中长度 ≥k 的充要条件是 start≤right−k+1。因此以 right 为右端的合法子串有 max(0, (right−k+1)−left+1) 个。
- 对每个右端点累加即可。注意按出现位置计数:样例里两段 abc 要算两次。
- 只输出最长长度、把 ≥k 写成 >k、或 O(n2) 枚举,都是常见假解。答案可能超过 32 位整数。
题目内容
给定字符串 s 和整数 k,统计 s 中有多少个连续子串同时满足:不含重复字符,且长度至少为 k。相同内容出现在不同位置算作不同子串。
输入描述
第一行一个由小写字母组成的字符串 s。
第二行一个整数 k。
输出描述
输出一个整数,表示这样的子串个数。
数据范围
- 1≤∣s∣≤105
- 1≤k≤105
样例1
输入:
abcabcbb
3
输出:
4
说明:长度为 3 且无重复的子串有 abc、bca、cab、abc,共 4 段。不存在更长的无重复子串。
样例2
输入:
aaaa
2
输出:
0