#include<iostream>
#include<cstring>
using namespace std;
void display_str(char s[])
{
for(int i=0;i<strlen(s);i++) cout<<s[i];
cout<<endl;
}
//字符串搜索的暴力匹配算法
bool get_same_str(char s1[],char s2[])
{
int len1=strlen(s1);
int len2=strlen(s2);
for(int i=0;i<len1-len2;i++)
{
//每一个i开始i+len2次数间进行比较
//如果不匹配对的话会break
bool rs=true;
for(int j=0;j<len2;j++)
{
//int pos=i;
if(s1[i+j]!=s2[j])
{
rs=false;
break;
}
}
//执行到这一步说明字符串已经匹配了
if (rs)
{
return true; // Found a match
}
}
return false;
}
//利用KMP算法进行处理
void get_next_table(string s,int next[])
{
//初始化
int j=0;
next[0]=0;
for(int i=1;i<s.size();i++)
{
//前后缀不相同,去找j前一位的最长相等前后缀
while(j>0&&s[i]!=s[j]) j=next[j-1];
if(s[i]==s[j]) j++;//前后缀相同,指针后移
next[i]=j;//更新next数组
}
}
int get_kmp_str(string s1,string s2)
{
if(s2.size()==0) return 0;
int next[1000];
get_next_table(s2,next);
int j=0;
for(int i=0;i<s1.size();i++)
{
//匹配next表
while(j>0&&s1[i]!=s2[j]) j=next[j-1];
if(s1[i]==s2[j]) j++;
//返回第一个s2出现的位置
if(j==s2.size()) return i-s2.size()+1;
}
return 0;
}
int main()
{
cout<<"*********************************************"<<endl;
char s1[]="NEUAIOPENAI";
char s2[]="UAI";
cout<<"字符串A:"; display_str(s1);
cout<<"字符串B:"; display_str(s2);
cout<<"*********************************************"<<endl;
cout<<"利用朴素匹配法匹配字符串!"<<endl;
cout<<"在字符串A中是否存在字符串B:"<<get_same_str(s1,s2)<<endl;
cout<<"*********************************************"<<endl;
cout<<"利用KMP算法匹配字符串!"<<endl;
int rs=get_kmp_str(s1,s2);
if(rs==0)
{
cout<<"在字符串A中是否存在字符串B:0"<<endl;
}
else
{
cout<<"在字符串A中是否存在字符串B:1"<<endl;
cout<<"字符串B在字符串A中的匹配位置为:"<<rs<<" to "<<rs+strlen(s2)-1<<endl;
}
cout<<"*********************************************"<<endl;
cout<<"所有操作结束!"<<endl;
cout<<"*********************************************"<<endl;
return 0;
}
字符串匹配的KMP算法
最新推荐文章于 2024-09-10 08:28:20 发布