OJ题--字串统计

问题描述 :
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。

输入说明 :
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
n<=60
S中所有字符都是小写英文字母。

输出说明 :
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa

输入范例 :
4
bbaabbaaaaa

输出范例 :
bbaa

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1000

//返回str中从start位置开始的len个字符
void getsub(char str[],int start,int len,char subs[]){
	int i,j=0;
	for(i=start;i<start+len;i++)
		subs[j++]=str[i];
	subs[j]='\0';
}

int main(){
	int i,j,k,c,maxc,maxlen,L,len;
	char s[max],sub[max],tsub[max],maxsub[max];
	scanf("%d",&L);
	getchar();
	gets(s);
	len=strlen(s);
	if(len==L)
		puts(s);
	else{
		//最大出现次数以及字符串长度
		maxc=0;
		maxlen=0;
		//每次选取字符串长度为i
		for(i=L;i<=len;i++){
			for(j=0;j<=len-i;j++){
				//首先获得一个长度i的子字符串
				getsub(s,j,i,sub);
				c=0;
				for(k=0;k<=len-i;k++){
					getsub(s,k,i,tsub);
					//统计sub子串出现的次数
					if(strcmp(sub,tsub)==0)
						c++;
				}
				if(maxc<c||(maxc==c&&i>maxlen)){
					strcpy(maxsub,sub);
					maxc=c;
					maxlen=i;
				}
			}			
		}
		puts(maxsub);
	}
	return 0;
}



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