预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

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();//清空缓存区,否则将自动读入输入选项时候按下