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
相关产品推荐
相关产品推荐

