首页 > 学院 > 开发设计 > 正文

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

2019-11-06 06:38:38
字体:
来源:转载
供稿:网友
算法训练 字串统计题目:问题描述  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。输入格式  第一行一个数字L。  第二行是字符串S。  L大于0,且不超过S的长度。输出格式  一行,题目要求的字符串。  输入样例1:  4  bbaabbaaaaa  输出样例1:  bbaa  输入样例2:  2  bbaabbaaaaa  输出样例2:  aa数据规模和约定  n<=60  S中所有字符都是小写英文字母。提示  枚举所有可能的子串,统计出现次数,找出符合条件的那个分析:三个for,枚举字符串的长度 * 枚举该字符串的长度的所有起始位置对应的字符串(在总字符串中的所以位置) * 枚举该字符串的长度的所以起始位置对应的字符串与其他同长的子串对比(出现次数)。注释比较清楚。比如:bbaabb 的所以长度有 :i = 1,2,3,4,5,6i = 2长度下的起始位置对于的字符串:bb,ba,aa,ab,bbi = 2长度下的起始位置对于的字符串中bb对于其他字符串(bb自身,ba,aa,ab,bb)是否相同得出该字符的出现次数。代码在此:(蓝桥杯测试100分)
#include<stdio.h>#include<string.h>#include<stdlib.h>#define SIZE 61char S[SIZE];void fun (char str[], int st, int fin) {	//截取总字符串S的起点 st 到 终点 fin 的子串到str 	int i;	int k = 0;	for(i = st; i < fin; i ++, k ++){		str[k] = S[i];	}	str[k] = '/0';}int main () {		int L;	int i,j,k;	int len;	//存储字符串的总长 		scanf("%d", &L);	scanf("%s", S);	char all_s[SIZE];	//最新最优的字符串的存储 	int all_i;	//最新最优字符串的长度 	int all = 0;	//最新最优字符串的出现次数 		int temp_num = 0;	//临时字符串的出现次数 	char temp[SIZE];	//临时字符串的存储 	char temp_e[SIZE];	//对于某临时字符串的其他字符串的存储 	len = strlen(S);		for(i = L; i < len; i ++){	//枚举所以的字符串可能出现的长度 		for(j = 0; j < len-i; j ++){	//枚举该长度(i)的该字符串的起点 			temp_num = 0;			fun(temp,j,j+i);	//j为起点,j+i-1为终点 			for(k = 0; k < len-i;k ++){	//临时字符串对比相同长度的字符串是否有相同 				 fun(temp_e,k,k+i);				 if(strcmp(temp_e,temp) == 0){				 	temp_num ++;				 }			}			if(temp_num > all){	//如果临时字符串的出现次数多于上次最优的字符串的次数 直接代替 				all_i = i;				all = temp_num;				strcpy(all_s,temp);			} else if(temp_num == all && i > all_i){	//如果临时字符串的与上次出现的最优字符串出现的次数相同且更长则代替 				all_i = i;				all = temp_num;				strcpy(all_s,temp);			}		}	}		PRintf("%s",all_s);		return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表