C++如何统计起始位置为子串长度倍数的非重叠子串数量
问题根因
你的原有代码逻辑存在核心缺陷:每次调用find匹配到任意位置的子串后,不管该位置是否符合「起始位置为子串长度倍数」的要求,都会直接跳过整个子串长度向后查找,导致不符合要求的匹配项会跳过后续合法的检查位置,最终出现漏匹配。
解决方案
我们不需要用find全局搜索匹配,因为要求的候选起始位置是固定的:所有满足offset % sub.length() == 0的位置,直接遍历这些候选位置即可,逻辑清晰且不会漏匹配。
修改后可运行代码
#include <iostream> #include <string> using namespace std; int main() { string str = "aaaaaaaaaabaaaaaaba"; string sub = "aa"; int count = 0; size_t sub_len = sub.length(); size_t str_len = str.length(); size_t offset = 0; while (offset + sub_len <= str_len) { // 仅检查起始位置为子串长度倍数的位置 if (offset % sub_len == 0) { if (str.substr(offset, sub_len) == sub) { ++count; cout << "offset: " << offset << " count: " << count << endl; } // 无论是否匹配,下一个候选位置都是当前位置加子串长度 offset += sub_len; } else { // 对齐到下一个合法候选位置 offset += (sub_len - offset % sub_len); } } cout << "count: " << count << endl; return 0; }
验证结果
- 当子串为
aa时,运行返回计数为7,符合预期 - 当子串为
aaa时,运行返回计数为4,符合预期
内容的提问来源于stack exchange,提问作者enki
相关产品推荐
相关产品推荐

