问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
这道题一开始在findStr()函数上走了不少弯路,而且在函数中定义str为数组时
输出结果总是出错,网上查后才知道返回数组不可靠的原因:
数组在函数调用完时内存已被系统回收,里面的值虽然不会一下子不见,但有可
能被其它程序用了,里面的值就有可能被修改,所以出错
用malloc动态申请,然后先不要free掉,这样findStr调用完返回的str就不会被回收,其值不会被修改
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
这道题一开始在findStr()函数上走了不少弯路,而且在函数中定义str为数组时
输出结果总是出错,网上查后才知道返回数组不可靠的原因:
数组在函数调用完时内存已被系统回收,里面的值虽然不会一下子不见,但有可
能被其它程序用了,里面的值就有可能被修改,所以出错
用malloc动态申请,然后先不要free掉,这样findStr调用完返回的str就不会被回收,其值不会被修改
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 60
int L;
char s[MAXSIZE];
int vi[MAXSIZE];
void init()
{
int i;
for(i = 0; i < MAXSIZE; i ++){
vi[i] = 1;
}
}
int countSame(int i, int len)
{
int j, count;
char s1[MAXSIZE], s2[MAXSIZE];
count = 0;
strcpy(s1, s+i);
s1[len] = '\0';
for(j = i+1; j+len <= strlen(s); j ++){
if(! vi[j]){
continue;
}
strcpy(s2, s+j);
s2[len] = '\0';
if(strcmp(s1, s2) == 0){
count ++;
vi[j] = 0;
}
}
return count;
}
char *findStr()
{
int i, l, tempLen, counTemp0, counTemp1, countStr;
char temp[MAXSIZE];
char *str = (char *)malloc(sizeof(char) * MAXSIZE);
l = strlen(s);
tempLen = L;
counTemp0 = counTemp1 = countStr = 0;
while(tempLen <= l){
init();
counTemp0 = counTemp1 = 0;
for(i = 0; i+tempLen <= l; i ++){
if(! vi[i]){
continue;
}
vi[i] = 0;
counTemp0 = countSame(i, tempLen);
if(counTemp0 > counTemp1){
counTemp1 = counTemp0;
strcpy(temp, s+i);
temp[tempLen] = '\0';
}
}
if(counTemp1 >= countStr){
countStr = counTemp1;
strcpy(str, temp);
}
tempLen ++;
}
return str;
}
int main()
{
scanf("%d%s", &L, s);
char *theStr = findStr();
printf("%s",theStr);
free(theStr);
return 0;
}