如何修改字符串模式匹配函数以避免重叠子串重复计数?
非重叠模式匹配计数的函数修改方案
原函数的问题在于匹配到模式后仍会逐个递增索引,导致统计重叠的子串。要实现忽略重叠的计数,只需在匹配成功后跳过整个模式的长度即可。
修改后的代码如下:
int countFreq(string pat, string txt) { int M = pat.length(); int N = txt.length(); int res = 0; for (int i = 0; i <= N - M; i++) { int j; for (j = 0; j < M; j++) if (txt[i + j] != pat[j]) break; if (j == M) { res++; // 跳过当前模式的长度,避免重叠匹配 i += M - 1; } } return res; }
修改说明
当检测到一次完整匹配后,通过i += M - 1调整索引:因为for循环本身会执行i++,所以这一步会让下一次循环的索引直接跳到当前匹配子串的末尾之后,彻底跳过所有可能与当前匹配重叠的位置,确保每次统计的都是非重叠的模式出现。
用你给出的测试案例验证:
- 模式"121",文本"12121212",修改后的函数会在索引0和4处匹配,最终返回结果2,符合需求。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

