KMP字符串匹配-2019.11.18

序言:本來是打算把那個WP完善一下的,結果由於一些原因,把KMP字符串匹配算法寫了,這個是我完善了的,可能還是不太好,但是慢慢努力吧!

KMP算法源代碼

頭文件:

#include<iostream>
#include <string>
using namespace std;//使用命名空間

計算next的值:

void calculate_next(string p,int next[])
{//計算next的值
    int len=p.length();//接受字符串的長度
    int  k= -1,j=0;
    next[0]=-1;
    while(j < (len-1))
    {
        if(k == -1 || p[j] == p[k])
        {
            ++k;
            ++j;
            next[j]=k;
        }
        else
        {
            k = next[k];
        }
    }
}

KMP核心算法:

int   KmpSearch(string s1,string s2,int next[])
{//KMP的核心算法
    int i=0;
    int j=0;
    int len1=s1.length();//接受字符串的長度
    int len2=s2.length();//接受字符串的長度
    while (i<len1 && j<len2)
    {
        if (j== -1 ||  s1[i]==s2[j])
        {i++;j++;}
        else
        {j=next[j];}
    }
    if (j==len2)
    {return i-j;}
    else
    {return -1;}
}

主函數(定義變量):

 system("color F0");
 int a1;//用戶輸入的主串字符串的長度
 int b1;//用戶輸入的子串字符串的長度
 int *L;//指向用戶輸入的字串的第一個數組
 string s;//接受用戶輸入的主串
 string a;//接受用戶輸入的字串
    string s1="jadfasjfabcdabdabcjdafjakf";//演示:原字符串
    string s2="abcdabdabc";//演示:要匹配的字符串
    int next[10]={0};

主函數(演示代碼):

    calculate_next(s2,next);
 cout<<"-------下面爲演示-------"<<endl;
    cout<<"現在每個字符上所對應的next的值爲:"<<endl;
    for (int i=0;i<10;i++)
    {cout<<next[i]<<" ";}
    cout<<endl;
    int point=KmpSearch(s1,s2,next);
    cout<<"搜尋結果:"<<endl;
    cout<<s1<<endl;
    for (int j=0;j<point;j++)
    {cout<<" ";}
    cout<<s2<<endl;
    cout<<"在原字符串匹配成功的位置:";
    cout<<point<<endl;
 cout<<"-------演示結束-------"<<endl;
 cout<<"\n"<<endl;

主函數(接受用戶輸入):

 //程序開始;接受用戶輸入
 cout<<"請輸入您要匹配的字符串主串:"<<endl;
 getline(cin,s);
 cout<<"\n"<<endl;
 a1=s.length();//主串字符長度
 cout<<"請輸入您要匹配的字符串子串"<<endl;
 getline(cin,a);
 b1=a.length();//字串字符長度

調用函數:

 L=(int*)malloc(sizeof(int)*b1);//指向用戶輸入的字串的首個字符
 memset(L,0,b1);//把數組中的每個字符都賦值爲:0
 calculate_next(a,L);//調用函數計算next數值

打印結果:

 //打印結果
 cout<<"現在每個字符上所對應的next的值爲"<<endl;
 for (int i=0;i<b1;i++)
    {cout<<L[i]<<" ";}
 int point1=KmpSearch(s,a,L);
 cout<<"\n"<<endl;
 cout<<"搜尋結果:"<<endl;
 cout<<s<<endl;
    for (int j=0;j<point1;j++)
    {cout<<" ";}
    cout<<a<<endl;
 //先判斷後輸出
 if (point1==-1)
 {//沒有匹配到
  cout<<"\n";
  cout<<"沒有可以匹配的字符串!";
 }
    else 
 {//匹配成功
  cout<<"\n";
  cout<<"在原字符串匹配成功的位置:";
  cout<<point1<<endl;
 }

就先寫到這裏吧!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章