试题 算法训练 字串统计

  • Post author:
  • Post category:其他




资源限制

时间限制: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中所有字符都是小写英文字母。



提示

枚举所有可能的子串,统计出现次数,找出符合条件的那个



题解

#include <stdio.h>
#include <string.h>

int main() {
    int l;
    char a[61];
    int max_times = 1;
	int location = 0;
	int lenth = 0;
    scanf("%d", &l);
    scanf("%s", &a);
    for (int len = l; len <= strlen(a); len++) {  //控制比较字串的长度
        for (int i = 0; i + len <= strlen(a); i++) {//定义比较字串的首地址
			int times = 0;
			for(int j = 0; j + len <= strlen(a); j++){//遍历比较
				int judge = 0;
				for(int k = j; k < j + len; k++){
					if(a[k] != a[i + k - j]){
						judge = 1;
						break;
					}
				}
				if(judge == 0){
					times ++;
				}
			}
			if((times > max_times) || (len > lenth && times == max_times)){
				max_times = times;
				location = i;
				lenth = len;
			}
        }
    }
	for(int i = location; i < location + lenth; i++){
		printf("%c", a[i]);
	}
}



题解优化:

使用c++的substr()函数会简化代码过程。



版权声明:本文为XTU_xyx原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。