如何检测字符串中是否存在若干个0后跟随等量1的重复模式?
问题分析与修复
先直接说你代码的核心问题:
- 字符串操作逻辑完全颠倒:你用
num[i]从头部取字符做判断,却用num.pop_back()从尾部删字符存到st0/st1里。比如原字符串是"0011",你判断的是前两个'0'相等,但存的却是最后一个'1',所有统计逻辑全错。 - 越界访问导致死循环:当
num只剩1个字符时,num[j+1]会访问超出字符串范围的内存,这时候行为未定义,大概率让循环条件一直成立,直接死循环。 - 计数逻辑混乱:外层循环的
k用来统计处理过的字符数,但你每次pop就加1,可内部的i、j从0递增,和实际处理的字符位置完全不匹配,没法控制外层循环正常结束。
正确实现思路
要检测“若干个0后跟随数量相等的1”的重复模式,应该从左到右遍历,每轮做这几件事:
- 统计当前连续0的个数(必须从当前位置开始是0,否则直接判定错误)
- 紧接着统计连续1的个数(统计完0后没有1直接错误)
- 比较0和1的个数,不等则错误
- 把指针移到这段1的末尾,继续处理剩余字符串,直到整个字符串处理完毕
修复后的代码
#include <iostream> #include <string> using namespace std; void check(string num) { int len = num.length(); int idx = 0; // 当前遍历的位置 while (idx < len) { // 统计连续的0的数量 int count0 = 0; while (idx < len && num[idx] == '0') { count0++; idx++; } // 没有0直接不符合模式 if (count0 == 0) { cout << "incorrect\n"; return; } // 统计紧接着的连续1的数量 int count1 = 0; while (idx < len && num[idx] == '1') { count1++; idx++; } // 1的数量和0不等,直接错误 if (count1 != count0) { cout << "incorrect\n"; return; } } // 所有段都符合条件 cout << "correct\n"; } // 测试示例 int main() { check("001101"); // 输出correct check("01"); // 输出correct check("001010"); // 输出incorrect return 0; }
代码说明
- 用
idx指针从左到右遍历,避免修改原字符串,逻辑更清晰 - 每轮先统计连续0的个数,确保模式以0开头
- 再统计紧接着的连续1的个数,必须和0的数量匹配
- 遍历完整个字符串无异常,就说明符合要求
内容的提问来源于stack exchange,提问作者tired
相关产品推荐
相关产品推荐

