滑动窗口法统计变位词出现次数出错,求代码问题排查
问题分析与修复
你的滑动窗口思路方向正确,但核心错误出在窗口滑动时的字符串删除操作上:
错误点
当窗口长度达到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
相关产品推荐
相关产品推荐

