字串统计(蓝桥杯)

版权声明:盗版必究 https://blog.csdn.net/qq_42837885/article/details/86708075

问题描述

给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

输入样例1:
  4
  bbaabbaaaaa

输出样例1:
  bbaa

输入样例2:
  2
  bbaabbaaaaa

输出样例2:
  aa
数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。
提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个

代码

#include<stdio.h>
#include<string.h>
#define max 100000
int main()
{
	char s[60] = { 0 }, a[max][60] = { 0 };//s存储输入的字符串,a存储满足要求的所有子串 
	int l, slen, alen = 0;//slen是字符串s的长度,alen是a中子串的个数 
	int i, j, k;
	int ashu[max] = { 0 };//ashu数组存储的是与a中对应下标子串的个数 
	scanf("%d", &l);
	scanf("%s", s);
	slen = strlen(s);
	for (i = l; i < slen; i++)//子串所有长度的可能 
	{
		for (j = 0; j <= slen - i; j++)//子串开始的下标 
		{
			char t[60] = { 0 }; int txia = 0;//t为截取的子串 
			for (k = j; k < j + i; k++)
				t[txia++] = s[k];
			
			int tt = 0;             //标记新的子串在子串库a中是否有 
			for (k = 0; k < alen; k++)//搜索子串库a 
				if (strcmp(a[k], t) == 0)
				{
					ashu[k]++;//在对应下标的ashu数组加1,记录这个子串的个数 
					tt = 1;
					break; 
				}
			if (tt == 0)//表示是新的子串 
			{
				for (k = 0; k < i; k++)//加入子串库a 
				a[alen][k] = t[k];
				ashu[alen] = 1; 
				alen++;
			}
		}
	}
	int maxzhi = 0, maxx;//maxzhi表示出现次数最多的子串,maxx表示下标 
	for (i = alen - 1; i >= 0; i--)//从后搜索 ,因为出现次数相同的情况下输出长度大的子串 
		if (ashu[i] > maxzhi)
		{
			maxzhi = ashu[i];
			maxx = i;
		}
	for(i=maxx-1;i>=0;i--)//出现次数相同,子串长度相同的情况下往前搜索 
	if(ashu[i]==ashu[maxx]&&strlen(a[i])==strlen(a[maxx]))
	maxx=i;
	printf("%s\n", a[maxx]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42837885/article/details/86708075