问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
//
// main.c
// String_Statistics
//
// Created by Apple on 2019/8/8.
// Copyright © 2019 Apple_Lance. All rights reserved.
//
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
// insert code here...
//声明整形变量和整形数组变量
char S[1000], str[1000][1000], temp[100], out[100];
int L, i = 0, o_statistics = -100, t_statistics = -100, a, b, c;
//输入要统计的长度和统计的字符串对象
scanf("%d%c%c", &L, &S[0], &S[0]);
while(S[i]!='\n'){
scanf("%c", &S[i+1]);
i++;
}
S[i] = '\0';
//把要统计的所有子字符提出来,放到str里,每一行为一个子字符串,记得末尾加'\0'
for(a = 0;a<i+2-L;a++){
for(b = 0;b<L;b++)
str[a][b] = S[a+b];
str[a][b] = '\0';
}
//遍历所有每一个没被统计过的子字符串,
for(i=0;i<a-1;){
for(b=0;b<a;b++){
if(str[b][0] != '\0'){
for(c = 0;c<L;c++)
temp[c] = str[b][c];
temp[c] = '\0';
t_statistics = 1;
i++;
str[b][0] = '\0';
break;
}
}
//然后计算这个s字符串出现的次数
for(b++;b<a;b++){
if(!strcmp(str[b],temp)){
t_statistics++;
i++;
str[b][0] = '\0';
}
}
//最后如果,新的统计更大,则更新,或次数一样多,但字符串更长,更新
if(t_statistics > o_statistics || (t_statistics == o_statistics && strlen(temp) > strlen(out))){
strcpy(out, temp);
o_statistics = t_statistics;
}
}
//输出
i = 0;
while(out[i] != '\0')
printf("%c", out[i++]);
return 0;
}