码迷,mamicode.com
首页 > 编程语言 > 详细

【算法】KMP字符串匹配算法

时间:2018-05-05 21:13:14      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:gif   代码   close   实现   特殊情况   nbsp   ace   style   数组   

【原理】

(1)next数组原理

技术分享图片

 (2)特殊情况的处理(巧妙增设哨兵)

技术分享图片

(3)递推法构造next[]表

技术分享图片

 技术分享图片

 

【实现代码】

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 100;
char t[maxn];   //text
char p[maxn];
int next[maxn];

void getNext(){
     int m = strlen(p);
     int j=0;     //"主串指针" 
     next[0] = -1;
     int t = -1; //模式串指针 
     while(j<m-1){
         if(t<0 || p[j]==p[t]){
            next[++j] = ++t;     
        } 
        else{
            t=next[t];
        } 
     }       
} 

int KMP(){
    getNext();    //构造next表
    int n = strlen(t), i=0;//文本串长度 
    int m = strlen(p), j=0; //模式串长度
    while(j<m && i<n){
        if(j<0 || t[i]==p[j]){    //若匹配,一起前进 
            i++;
            j++;
        }    
        else{        //否则,p右移,t不退回 
            j=next[j];
        }
    } 
    return i-j;        
}


int main(){
    cin >> t; // abcdefgabkdabcdu
    cin >> p; // abkdab
    cout << KMP();
    return 0;
}
View Code

 

【参考资料】

邓俊辉教授数据结构

 

【算法】KMP字符串匹配算法

标签:gif   代码   close   实现   特殊情况   nbsp   ace   style   数组   

原文地址:https://www.cnblogs.com/chsobin/p/8996058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!