算法訓練 字串統計
時間限制:1.0s 內存限制:512.0MB
問題描述
給定一個長度為n的字符串S,還有一個數字L,統計長度大於等於L的出現次數最多的子串(不同的出現可以相交),如果有多個,輸出最長的,如果仍然有多個,輸出第一次出現最早的。
輸入格式
第一行一個數字L。
第二行是字符串S。
L大於0,且不超過S的長度。
輸出格式
一行,題目要求的字符串。
輸入樣例1:
4
bbaabbaaaaa
輸出樣例1:
bbaa
輸入樣例2:
2
bbaabbaaaaa
輸出樣例2:
aa
數據規模和約定
n<=60
S中所有字符都是小寫英文字母。
提示
枚舉所有可能的子串,統計出現次數,找出符合條件的那個
解題思路
就像題目提示所說的,枚舉所有可能出現的子串,注意題目說的是長度大於等於L的子串,要用一層循環來控制L的變化。長度為n的子串在長度為len的總串中可以有len-n個。定義一個結構體來存儲各種形式的子串、其長度、其出現次數。
最後根據題目要求:如果有多個,輸出最長的,如果仍然有多個,輸出第一次出現最早的排序。
代碼
#include
#include
#include
using namespace std;
struct chuan
{
char s[70];
int sum;
int lens;//這個是為了記錄不同子串的長度
}ss[2000];//n的數目+(n+1)的數目+...+len的數目,最多有1+2+...+60
bool cmp(chuan a,chuan b)
{
if(a.sum!=b.sum)
return a.sum>b.sum;
else
return a.lens>b.lens;
}
//題目要求:如果有多個,輸出最長的,如果仍然有多個,輸出第一次出現最早的。
char sss[70];
char now[70];
int main()
{
int n;
int len;
int ok;
int i,j,k,l;
int num;
scanf("%d",&n);
getchar();
scanf("%s",sss);
len=strlen(sss);
memset(ss,0,sizeof(ss));
num=0;//存儲一共有幾種子串
while(n<=len)//統計長度大於等於L的出現次數最多的子串
{
for(i=0;i