如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
#include<iostream>
#include<string>
usingnamespacestd;
int*get_next(char*T,int*next);//声明get_next函数以获取next数组
intKMP(char*S,char*T);//声明KMP函数调用next函数来进行查找
intget_choice();//选择要执行的功能
voidserach(stringS);//定义查找函数
voidadd_char(string&S);//定义添加函数
voidchange(string&S);//定义替换函数
voiddelete_char(string&S);//定义删除函数
voiddisplay(string&S);//显示函数,用于显示当前的字符串
int*get_next(constchar*T,int*next){
inti=0,j=-1;
intlength=strlen(T); //根据T字符串将所得到的next数组值存在next指针指向数组中
int*temp=next;
*next=-1;
while(i<length){
if(j==-1||*(T+i)){
i++;//如果字符串中第i个字符与从头起第j个相同,则i,j分别向后移一位
j++;
if(*(T+i)!=*(T+j))
*(next+i)=j;//当遇到第一个不相同的字符时,当前的j值就是next数组第i个元素的值
else
*(next+i)=*(next+j);//如果相同,则从字符串开始第j个元素的next值与当前位置的值相同
}
else
j=*(next+j);//如果遇到第i个元素和从头起的第j个元素不相同,则从第j个元素的next值的位置回溯
}
returntemp;
}
intKMP(stringS,stringT){
intS_Length=S.length();
intT_Length=T.length();
if(S_Length<T_Length)
return0;//如果目标串比要查找的串要短,直接返回失败
inti=0,j=0;
int*next=newint[T_Length];
get_next(T.c_str(),next);
while(i<S_Length&&j<T_Length){
if(j==-1||*(S.c_str()+i)==*(T.c_str()+j)){
i++;//如果对应i,j元素相同,则依次向后错一位
j++;
}
else
j=*(next+j);//否则通关next函数,将j指针回溯一定距离
}
if(j>=T_Length)
returni-T_Length+1;//当j==T_Length时,意味查找成功,返回开始字符所在的位置
else
return0;//否则返回失败
}
intget_choice(){//获取用户输入的选项,以进行相应操作
inttemp;
cout<<"请输入你即将执行的操作:\n1——查找\t2——添加\t3——替换\n4——删除\t5——显示当前字符串\t6——退出\n你的选择:"<<endl;
while(1){
cin>>temp;
if(temp<7&&temp>0)//只有输入1-6时才返回输入的选项
returntemp;
else
{
cout<<"你的输入有误,请重新输入\n你的选择:";
}
}
}
voidserach(stringS){
intk;
stringT;
cout<<"请输入要查找的串:";
cin.sync();//清空缓存区,否则将自动读入输入选项时候按下的回车键
getline(cin,T);
if(k=KMP(S,T))//KMP的返回值不为0即查找成功时候,if条件判断认为是真
cout<<"所要查找的字符串从第"<<k<<"个字符开始"<<endl;
else
cout<<"查找失败!"<<endl;
}
voidadd_char(string&S){
intk;
stringm;
cout<<"请输入你想插入的位置";
while(1)
{
cin>>k;
if(k>=0&&k<=S.length())//插入的位置不能再字符串外面
break;
else
cout<<"你输入的位置有误,请重新输入你想插入的位置:";
}
cout<<"请输入你要插入的字符串:";
cin.sync();//清空缓存区,否则将自动读入输入选项时候按下
赫赫****等你
实名认证
内容提供者
最近下载