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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:03