//时间复杂度O(n),空间复杂度O(1)
int numKLenSubstrRepeats(string s, int k)
{
char reChar = 0;//当前重复字符
int num = 0;//满足要求的子串数量
vector<short> inQueue(26, 0);//在队列中各字符的数量
//扫描
for (size_t i = 0; i < s.size(); ++i)
{
if (inQueue[s[i] - 'a'] && reChar != s[i])//更新当前重复字符
{
reChar = s[i];
}
++inQueue[s[i] - 'a'];
if (reChar != 0 && inQueue[reChar - 'a'])//判断是否存在重复字符
{
if (i >= k - 1) ++num;
}
if (i >= k - 1)//队列的容量为k,只有满了才会退队
{
--inQueue[s[i - k + 1] - 'a'];//队列尾部字符退队
if (s[i - k + 1] == reChar && inQueue[reChar - 'a'] == 1)//判断reChar是否还重复
{
reChar = 0;
}
}
}
return num;
}