You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滑动窗口法统计变位词出现次数出错,求代码问题排查

问题分析与修复

你的滑动窗口思路方向正确,但核心错误出在窗口滑动时的字符串删除操作上:

错误点

当窗口长度达到k后,你执行了s.erase(i, 1)——这里的i是原文本的左指针索引,但string s存储的是当前窗口内的字符,它的长度始终为k(进入j-i+1==k分支时),此时要移除窗口最左侧的字符,应该用s.erase(0, 1),而非用原文本的i作为删除起始位置。

举个例子:第一次窗口是txt[0-2],s为"for",此时i=0,erase(0,1)没问题;但第二次窗口滑动后i=1,如果还用s.erase(1,1),会删掉s的第二个字符,导致s变成"fr",再加上下一个字符x后,s变成"frx",这显然不是正确的窗口内容,后续排序对比自然出错。

修复后的代码

int search(string pat, string txt)
{
    string s = "";
    int n = txt.size();
    int k = pat.size();
    int i = 0;
    int j = 0;
    int count = 0;
    sort(pat.begin(), pat.end());
    while (j < n)
    {
        s += txt[j];

        if (j - i + 1 < k)
        {
            j++;
        }
        else if (j - i + 1 == k)
        {
            string temp = s;
            sort(temp.begin(), temp.end());
            if (temp == pat)
            {
                count++;
            }
            // 移除窗口最左侧的字符,而非原文本索引i对应的位置
            s.erase(0, 1);
            i++;
            j++;
        }
    }
    return count;
}

额外优化建议

每次对窗口字符串排序的时间复杂度是O(k log k),如果文本很长,效率会偏低。可以改用字符频率统计的方式:统计pat的字符出现次数,然后用滑动窗口维护当前窗口的字符频率,对比两者是否一致,这样时间复杂度可以降到O(n),更适合处理大规模输入。

内容的提问来源于stack exchange,提问作者Abhimanyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:08:11