字串统计

/*
问题描述
  给定一个长度为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++]);
		}
	}
}


发布了37 篇原创文章 · 获赞 0 · 访问量 350

猜你喜欢

转载自blog.csdn.net/weixin_43191153/article/details/104464991