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

Rust如何统计字符串中含重叠匹配的子串出现次数

Rust 重叠子串匹配次数统计方案

实现思路

利用标准库str内置的find方法迭代查找,每次匹配成功后将下一次的搜索起始位置后移1位,即可实现重叠匹配,无需手动实现逐字符匹配逻辑,性能也优于手写匹配实现。

示例代码

/// 统计子串在目标字符串中的重叠匹配次数
fn count_overlapping(s: &str, sub: &str) -> u32 {
    let mut count = 0;
    let mut search_start = 0;
    let sub_len = sub.len();
    
    // 边界处理:空串或子串长度大于目标串直接返回0
    if sub_len == 0 || sub_len > s.len() {
        return 0;
    }

    while let Some(matched_pos) = s[search_start..].find(sub) {
        count += 1;
        // 下一次从匹配位置的下一个字符开始搜索,支持重叠
        search_start += matched_pos + 1;
    }

    count
}

fn main() {
    let s = "CNCNC";
    let substring = "CNC";
    // 测试用例验证,输出结果为2
    assert_eq!(count_overlapping(s, substring), 2);
    println!("匹配次数:{}", count_overlapping(s, substring));
}

说明

  • 相比直接使用matches()方法,该实现支持重叠匹配,同时复用了标准库的高效字符串查找能力,无需手写冗长的匹配逻辑。
  • 函数参数使用&str而非&String,适配更多调用场景,无需强制传入String类型。
  • 天然支持合法UTF-8字符串的匹配,无需额外处理多字节字符问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:30:01