您的位置:首页 > 其它

程宝P225 求一个字符串中连续出现次数最多的子串。

2013-08-18 21:42 274 查看
书上提供的方法,先将字符串的长度为1:n的后缀子串取出,针对每一个后缀子串,遍历其前缀子串,计算每个前缀子串连续出现次数,一旦发现有有连续子串出现,将计数器+1,然后针对该子串继续判断它是否会再次连续出现,若是则将计数+1,若不是,则跳出循环。继续计算下一个子串连续出现的次数。直到所有的后缀子串都遍历结束,输出最大值。

#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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: