序言:本來是打算把那個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;
}
就先寫到這裏吧!