问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
这里我用了substr函数,用来截取字符串(具体用法百度一下),用一个vector<pair<string,int> >容器来盛放截取的字符串
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<pair<string,int> > v;
typedef vector<pair<string,int> >::iterator iter;//定义迭代器
int main()
{
string s,Max;//Max盛放结果
pair<string,int> tmp;
int l,Maxi=-1,flag=0;//Maxi盛放Max出现的次数,flag用来表示是否在容器中找到截取的字符串
cin>>l>>s;
for(int i=l;i<=s.length();i++)//控制截取长度
for(int j=0;j<=s.length()-i;j++)//控制截取位置
{
if(v.empty())//如果容器为空
{
tmp=make_pair(s.substr(j,i),1);
v.push_back(tmp);
}
else
{
for(iter k=v.begin();k!=v.end();k++)//查找容器内是否有截取的字符串
if(s.substr(j,i)==(*k).first)//如果有就把字串出现的次数+1
{
(*k).second++;
flag=1;
}
if(!flag)//如果没有,把截取的字符串加进去
{
tmp=make_pair(s.substr(j,i),1);
v.push_back(tmp);
}
flag=0;
}
}
for(iter k=v.begin();k!=v.end();k++)
{
if((*k).second>Maxi||(*k).second==Maxi&&(*k).first.length()>Max.length())//优先取出现次数多的,如果出现次数相同取长的
{
Maxi=(*k).second;
Max=(*k).first;
}
}
cout<<Max<<endl;
return 0;
}