C中在一个字符串中查找另一个字符串出现的次数,求详细说明,非常感谢大虾们的不吝赐教

2025-03-11 04:32:37
推荐回答(1个)
回答1:

还是利用的数据结构中介绍的KMP算法,集体可以查阅清华大学的那版教材,只是在求解中最外面加了一层循环保证找遍这个输入的串
#include
#include
using namespace std;
int main()
{
string ssid="as";//模式串
string longstring="asd as as dfg asas dfkjjkdkskksjasdkkskd";//待查找的串
//一下获得as的nextval值
int len=ssid.length();
int *nextval=new int[len];
nextval[0]=-1;
int j=0;
int k=-1;
nextval[j]=k;
while(j {
if(k==-1||ssid[j]==ssid[k])
{
j++;
k++;
if(ssid[j]==ssid[k])
nextval[j]=nextval[k];
else
nextval[j]=k;
}
else
k=nextval[k];
}
//利用得到的nextval查找
j=0;
int i=0,cnt=0;//cnt用于记录有多少个匹配的字串
int lenl=longstring.length();
while(1)
{
j=0;
while(j {
if(j==-1||longstring[i]==ssid[j])
{
++i;
++j;
}
else
j=nextval[j];
}
if(i>=lenl)break;
if(j>=len)
{//子串已指到尾
cnt++;
cout<<"pos="<<(i-len+1)< }
}
if(cnt==0)
cout<<"no such substring\n";
system("pause");
return 0;
}
希望对你有用,可运行之