全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++怎么实现一个KMP字符串匹配算法_C++算法设计与KMP原理

KMP算法通过构建next数组实现高效字符串匹配,利用模式串自身重复信息减少主串指针回退,在O(n+m)时间内完成匹配。核心是预处理生成部分匹配表(next数组),记录各位置最长相等前后缀长度;匹配时失配则根据next数组移动模式串指针,避免主串指针回溯。C++实现包含buildNext和kmpSearch函数,分别构造next数组并执行搜索,适用于长文本场景,较暴力匹配更稳定高效。

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,能够在O(n + m)时间内找出模式串在主串中的位置,避免了暴力匹配中大量的回溯。C++实现KMP的关键在于预处理模式串生成“部分匹配表”(即next数组),然后利用该表跳过不必要的比较。

理解KMP的核心思想

KMP算法的核心是利用模式串自身的重复信息来减少主串指针的回退。当匹配失败时,主串指针不回退,仅移动模式串指针到合适位置,这个位置由next数组决定。

next数组记录的是:对于模式串每个位置j,其前面子串的最长相等前缀与后缀的长度。例如模式串"ABABC",在位置4(字符'C'前),最长公共前后缀是"AB",长度为2,因此next[4] = 2。

构建next数组(失配函数)

next数组的构造过程也是一个类似KMP匹配的过程,本质上是模式串自己和自己匹配。

  • 初始化next[0] = 0,因为单个字符没有真前后缀
  • 使用两个指针i和j,i遍历模式串,j表示当前最长公共前后缀长度
  • 若pattern[i] == pattern[j],则next[i+1] = j+1,i和j同时后移
  • 若不相等且j > 0,则j回退到next[j-1]继续比较
  • 若j=0,则next[i+1]=0,i继续后移

代码实现:

vector buildNext(const string& pattern) {
    int m = pattern.length();
    vector next(m, 0);
    int j = 0;
    for (int i = 1; i < m; i++) {
        while (j > 0 && pattern[i] != pattern[j]) {
            j = next[j - 1];
        }
        if (pattern[i] == pattern[j]) {
            j++;
        }
        next[i] = j;
    }
    return next;
}

执行KMP字符串匹配

使用构建好的next数组进行主串和模式串的匹配。

  • 用i遍历主串,j遍历模式串
  • 字符相等时,i和j都加1
  • 不相等时,若j > 0,则j回退到next[j-1];否则i加1
  • 当j等于模式串长度时,说明找到一次匹配,记录位置并继续

完整匹配函数:

vector kmpSearch(const string& text, const string& pattern) {
    vector positions;
    if (pattern.empty()) return positions;
vectorzuojiankuohaophpcnintyoujiankuohaophpcn next = buildNext(pattern);
int n = text.length();
int m = pattern.length();
int j = 0;

for (int i = 0; i zuojiankuohaophpcn n; i++) {
    while (j > 0 && text[i] != pattern[j]) {
        j = next[j - 1];
    }
    if (text[i] == pattern[j]) {
        j++;
    }
    if (j == m) {
        positions.push_back(i - m + 1);
        j = next[j - 1]; // 继续查找下一个匹配
    }
}
return positions;

}

使用示例与注意事项

调用方式简单:

int main() {
    string text = "ABABDABACDABABCABC";
    string pattern = "ABABC";
    vector result = kmpSearch(text, pattern);
    for (int pos : result) {
        cout << "Match found at index " << pos << endl;
    }
    return 0;
}

注意边界情况:空模式串、完全匹配、无匹配等。next数组构造是关键,理解j的回退逻辑是掌握KMP的重点。

基本上就这些。KMP虽然初看复杂,但只要搞懂next数组的意义和构造过程,实现起来并不难。在实际应用中,它比暴力匹配稳定高效,尤其适合长文本搜索场景。


# c++  # ai  # 字符串  # 指针  # 算法  # 遍历  # 时间内  # 退到  # 的是  # 后移  # 是一种  # 适用于  # 不回  # 若不  # 关键在于 


相关文章: 自助网站制作软件,个人如何自助建网站?  简历在线制作网站免费版,如何创建个人简历?  ,网页ppt怎么弄成自己的ppt?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何用好域名打造高点击率的自主建站?  建站之星价格显示格式升级,你的预算足够吗?  ,南京靠谱的征婚网站?  ,sp开头的版面叫什么?  建站之星如何开启自定义404页面避免用户流失?  如何有效防御Web建站篡改攻击?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  建站之星如何防范黑客攻击与数据泄露?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  常州自助建站费用包含哪些项目?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  为什么Go需要go mod文件_Go go mod文件作用说明  nginx修改上传文件大小限制的方法  制作网站怎么制作,*游戏网站怎么搭建?  Android自定义控件实现温度旋转按钮效果  平台云上自助建站如何快速打造专业网站?  太原网站制作公司有哪些,网约车营运证查询官网?  网站按钮制作软件,如何实现网页中按钮的自动点击?  简单实现Android文件上传  如何访问已购建站主机并解决登录问题?  制作网站的软件免费下载,免费制作app哪个平台好?  安云自助建站系统如何快速提升SEO排名?  建站上传速度慢?如何优化加速网站加载效率?  制作门户网站的参考文献在哪,小说网站怎么建立?  如何高效配置IIS服务器搭建网站?  如何选择建站程序?包含哪些必备功能与类型?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何选择适配移动端的WAP自助建站平台?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何选择靠谱的建站公司加盟品牌?  建站之星导航如何优化提升用户体验?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  C#怎么使用委托和事件 C# delegate与event编程方法  高性能网站服务器配置指南:安全稳定与高效建站核心方案  建站主机选购指南:核心配置优化与品牌推荐方案  建站VPS推荐:2025年高性能服务器配置指南  公司网站制作价格怎么算,公司办个官网需要多少钱?  广州美橙建站如何快速搭建多端合一网站?  网站网页制作专业公司,怎样制作自己的网页?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。

  • 返回顶部
  • 400-708-3566
  • QQ在线
  • 微信二维码