C++ 求长度为 K 的重复字符子串的数量

    //时间复杂度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;
    }

 

posted @ 2021-11-13 21:15  mshentai  阅读(147)  评论(0编辑  收藏  举报