您的位置:首页 > 其它

蓝桥杯 算法训练 字串统计

2015-01-25 20:32 274 查看
问题描述

  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。

输入格式

  第一行一个数字L。

  第二行是字符串S。

  L大于0,且不超过S的长度。

输出格式

  一行,题目要求的字符串。

  输入样例1:

  4

  bbaabbaaaaa

  输出样例1:

  bbaa

  输入样例2:

  2

  bbaabbaaaaa

  输出样例2:

  aa

数据规模和约定

  n<=60

  S中所有字符都是小写英文字母。

  提示

  枚举所有可能的子串,统计出现次数,找出符合条件的那个

看到这种字符串匹配色题目,可能会想到用KMP来做,但是再看提示,枚举就OK了,不过最好使用KMP,不多说,就是枚举出串,一一匹配。

#include<iostream>
#include<string>
using namespace std;
string str0,str1;
string str_te[100],str[100];
int time_te[100],time[100];

void search(int n,int n0)
{
int i,j,k,len,max,index;
str1="";
k=0;
max=0;
index=0;
len=str0.length();
for(i=0;i<100;i++)
time_te[i]=0;
for(i=0;i<len-n;i++)
{
for(j=i;j<i+n;j++)
{
str1=str1+str0[j];
}
//cout<<str1<<endl;
bool flag=true;
for(j=0;j<100;j++)
{
if(str_te[j]==str1)
{
time_te[j]++;
flag=false;
}
}
if(flag)
{
str_te[k]=str1;
time_te[k]++;
k++;
}
str1="";
}
for(i=0;i<100;i++)
{
//cout<<str_te[i]<<' '<<time_te[i]<<endl;
if(max<time_te[i])
{
max=time_te[i];
index=i;
}
}
//cout<<max<<' '<<index<<endl;
str[n0]=str_te[index];
time[n0]=max;
//cout<<str[i]<<' '<<time[i]<<endl;
}

int main()
{
int n,len,i,j,max,index;
cin>>n;
cin>>str0;
len=str0.length();
max=0;
index=0;
for(i=n,j=0;i<=len;i++,j++)
{
search(i,j);
}
for(i=0;i<100;i++)
{
//cout<<str[i]<<' '<<time[i]<<endl;
if(max<=time[i])
{
max=time[i];
index=i;
}

}
cout<<str[index]<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息