如果您无法下载资料,请参考说明:
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值与当前位置的值相同}elsej=*(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++;}elsej=*(next+j);//否则通关next函数,将j指针回溯一定距离}if(j>=T_Length)returni-T_Length+1;//当j==T_Length时,意味查找成功,返回开始字符所在的位置elsereturn0;//否则返回失败}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;elsecout<<"查找失败!"<<endl;}voidadd_char(string&S){intk;stringm;cout<<"请输入你想插入的位置";while(1){cin>>k;if(k>=0&&k<=S.length())//插入的位置不能再字符串外面break;elsecout<<"你输入的位置有误,请重新输入你想插入的位置:";}cout<<"请输入你要插入的字符串:";cin.sync();//清空缓存区,否则将自动读入输入选项时候按下