/*
问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(
不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
*/
使用dp jl[i][j][k] 表示分别 以j下标开头 和以 k下标开头的 长度为 i 的字符串是不是相同 0 代表不相同 1 代表相同
#include <stdio.h>
#include <string.h>
void q_zhi(int,char[]);
int main(void)
{
int len;
char zf[60+1];
scanf("%d%s",&len,zf);
q_zhi(len,zf);
return 0;
}
void q_zhi(int len,char s[])
{
static int jl[60+1][60+1][60+1] = {0};
int i,j,k,ls = strlen(s);
for(i = 0;i < ls;i++)
{
for(j = 0;j < ls;j++)
{
jl[0][i][j] = 1;
}
}
int max = -1,maxx = 0,maxy = 0;
for(i = 1;i <= ls;i++)
{
for(j = 0;j+i <= ls;j++)
{
int sum = 0;
for(k = j+1;k+i <= ls;k++)
{
if(jl[i-1][j][k] && s[j+i-1] == s[k+i-1])
{
jl[i][j][k]++;
sum += 1;
if( (max < sum && i >= len)||(max == sum && i > (maxy-maxx)))
{
max = sum;
maxx = j;
maxy = j+i;
}
}
}
}
}
if(maxy - maxx >= len)
{
while(maxx < maxy)
{
printf("%c",s[maxx++]);
}
}
}