程宝P225 求一个字符串中连续出现次数最多的子串。
2013-08-18 21:42
274 查看
书上提供的方法,先将字符串的长度为1:n的后缀子串取出,针对每一个后缀子串,遍历其前缀子串,计算每个前缀子串连续出现次数,一旦发现有有连续子串出现,将计数器+1,然后针对该子串继续判断它是否会再次连续出现,若是则将计数+1,若不是,则跳出循环。继续计算下一个子串连续出现的次数。直到所有的后缀子串都遍历结束,输出最大值。
方法二:
1、找出字符串中所有的子串,去除重复。
2、对于每一个子串,统计其连续出现的次数。
3、找出其中最大的次数和对应的子串。
题目的变化:找出连续出现的最长的子串
只需在第二种方法中修改一下,子串从长到短存入vector,再从长到短顺序判定,一旦发现有连续的子串,输出结果,结束程序。
#include<stdio.h> #include<string> #include<iostream> #include<string.h> #include <vector> using namespace std; //找出字符串中连续出现次数最多的子串 int main() { string str,svbstr; getline(cin,str); int len=str.length(); int i=0,j=0,cont=1,maxcont=1,k=0; vector<string> substrs; for(i=0;i<len;i++) { substrs.push_back(str.substr(i,len-i)); } for(i=0;i<len;i++) { for (j=i+1;j<len;j++) { cont=1;//忘记清零 if(substrs[i].substr(0,j-i)==substrs[j].substr(0,j-i)) { cont++; for(k=2*j-i;k<len;k+=j-i) { if (substrs[k].substr(0,j-i)==substrs[j].substr(0,j-i)) ++cont; else break; } } if (cont>maxcont) { maxcont=cont; svbstr=substrs[j].substr(0,j-i); } } } cout<<maxcont<<endl; cout<<svbstr; }
方法二:
1、找出字符串中所有的子串,去除重复。
2、对于每一个子串,统计其连续出现的次数。
3、找出其中最大的次数和对应的子串。
#include<stdio.h> #include<string> #include<iostream> #include<string.h> #include <vector> #include <algorithm> using namespace std; void stable_unique(vector<string>& con); //找出字符串中连续出现次数最多的子串 int main() { string str,svbstr; string::size_type p,p1,np; vector<string> substrs; getline(cin,str); int i=0,j=0,len=str.length(),cont=1,maxcont=1,sub_len; for(i=1;i<=(len/2+1);i++) for(j=0;j<=len-i;j++) substrs.push_back(str.substr(j,i)); for(vector<string>::iterator iter=substrs.begin();iter<substrs.end();iter++) cout<<*iter<<' '; cout<<endl; //去除重复的子串 stable_unique(substrs); for(vector<string>::iterator iter=substrs.begin();iter<substrs.end();iter++) cout<<*iter<<' '; for(vector<string>::iterator iter=substrs.begin();iter<substrs.end();iter++) { sub_len=(*iter).length(); p=str.find(*iter); while(p!=string::npos) { np=p+sub_len; p1=str.find(*iter,p+1); if (p1==np) { cont++; } else if(cont>maxcont) { maxcont=cont; svbstr=*iter; cont=1; } else cont=1; p=p1; } } cout<<endl; cout<<svbstr<<endl; cout<<maxcont; } void stable_unique(vector<string>& con) { vector<string>::iterator it,ret,beg = con.begin(); for (it = ++con.begin();it!=con.end();) { ret = find(beg,it,*it);//依次判定每个元素,在它之前查找是否有重复的元素,若有,则删除该判定元素。 if (ret != it) it = con.erase(it); else ++it; } }
题目的变化:找出连续出现的最长的子串
只需在第二种方法中修改一下,子串从长到短存入vector,再从长到短顺序判定,一旦发现有连续的子串,输出结果,结束程序。
#include<stdio.h> #include<string> #include<iostream> #include<string.h> #include <vector> #include <algorithm> using namespace std; void stable_unique(vector<string>& con); //找出字符串中连续的最长的子串 int main() { string str,svbstr; string::size_type p,p1,np; vector<string> substrs; getline(cin,str); int i=0,j=0,len=str.length(),sub_len ; for(i=len;i>=1;i--) for(j=0;j<=len-i;j++) substrs.push_back(str.substr(j,i)); for(vector<string>::iterator iter=substrs.begin();iter<substrs.end();iter++) cout<<*iter<<' '; cout<<endl; //去除重复的子串 stable_unique(substrs); for(vector<string>::iterator iter=substrs.begin();iter<substrs.end();iter++) cout<<*iter<<' '; for(vector<string>::iterator iter=substrs.begin();iter<substrs.end();iter++) { sub_len=(*iter).length(); p=str.find(*iter); while(p!=string::npos) { np=p+sub_len; p1=str.find(*iter,p+1); if (p1==np) { cout<<endl<<*iter; return 1; } p=p1; } } } void stable_unique(vector<string>& con) { vector<string>::iterator it,ret,beg = con.begin(); for (it = ++con.begin();it!=con.end();) { ret = find(beg,it,*it);//依次判定每个元素,在它之前查找是否有重复的元素,若有,则删除该判定元素。保持顺序不变。 if (ret != it) it = con.erase(it); else ++it; } }
相关文章推荐
- 字符串---求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串(程序面试宝典)
- 程序员面试宝典:求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 寻找一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中出现次数最多的子串(并不是连续的)
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 寻找一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 求一个字符串中连续出现次数最多的子串
- 最新的微软面试题,题目:求一个字符串中连续出现次数最多的子串