蓝桥杯 算法训练 ALGO-87 字串统计

算法训练 字串统计
时间限制:1.0s 内存限制:512.0MB
问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。
  输入样例1:
  4
  bbaabbaaaaa
  输出样例1:
  bbaa
  输入样例2:
  2
  bbaabbaaaaa
  输出样例2:
  aa
数据规模和约定
  n<=60
  S中所有字符都是小写英文字母。
提示
  枚举所有可能的子串,统计出现次数,找出符合条件的那个

分析:本题类似KMP算法,在主串中搜索子串。区别在于,这里的子串有很多,只要符合条件的子串,我们都要搜索一遍。然后统计他们出现的次数,将出现次数最多的子串输出。
思路:将子串按照长度不同分别遍历,若主串长度为 n n ,则
  主串中长度大于等于 L L 子串长度 n L + 1 n-L+1
  长度为k的的种类中有 n L + k n-L+k 个子串
分别判断这些子串的重复次数。遍历时从前向后,以满足题意输出第一次出现最早的。
这里可以优化一下,如果发现重复的子串,可以把后面的该子串置空,下次遍历到它的时候可以直接跳过,减少操作次数。
遍历完长度为k的子串,保留出现次数最多的子串和其出现次数,在全部子串枚举结束后,对不同长度子串中出现次数最多的子串再进行比较,保留所有子串中出现次数最多的子串。这里从子串长度最长的开始,以满足题意输出最长的。

#include <iostream>
#include <cstring>
using namespace std;
string fun(string S, int L)
{
	int len = S.length();
	string *aaa = new string[len-L+1];
	int *nnn = new int[len-L+1], bbb = len-L;
	for(int k = 1, l = 0; k > L-len; k--, l++)
	{
		int num =len - L + k;		//子串个数
		string *temp = new string[num];		//创建子串
		int *n = new int[num], result = 0;	//计算重复个数
		//分离子串
		for(int i = 0; i < num; i++)
		{
			temp[i].insert( 0, S, i, L+l);		//把string S中第i个开始长度为L的字符串拷贝给temp[i] 
			n[i] = 0;		//初始化重复个数为0
		}
		//计算每个子串重复次数 
		for(int i = 0; i < num; i++)
		{
			if(temp[i] != "")	//不为空就计算重复数
				for(int j = i + 1; j < num; j++)
				{
					if(temp[j] != "" && temp[i] == temp[j])	//如果重复
					{
						n[i]++;
						temp[j] = "";		//前面已经有相同的不需比较 
					}
				}
		}
		
		//比较,第几个子串重复数最多 
		int a = n[0];
		for(int i = 1; i < num; i++)
		{
			if(a < n[i])
			{
				a = n[i];
				result = i;
			}
		}
		
		nnn[l] = a;
//		aaa[l] = temp[result];
		aaa[l].insert( 0, temp[result]);
		delete n;
		delete []temp;
	}
	//最后的筛选 
	for(int l = len-L, ccc = nnn[len-L]; l >= 0; l--)
	{
		if(ccc < nnn[l])
		{
			ccc = nnn[l];
			bbb = l;
		}
	}
	//返回该子串的内容
	return aaa[bbb];
}
int main()
{
	int L;
	cin >> L;
	string S;
	cin >> S;
	cout << fun(S, L) << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43302818/article/details/85065441