算法训练 字串统计

  
时间限制: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<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int length[100][100],maxn;
char str[100];
int same(int s1,int s2,int len){
    for(int i=0;i<len;i++){
        if(str[i+s1]!=str[i+s2])
            return 0;
    }
    return 1;
}
int main(void){    
    int n,L;
    scanf("%d\n",&L);
    gets(str);
    n = strlen(str);
    if(n==0){
        printf("");
        return 0;
    }
    for(int len=L;len<=n;len++){
        for(int i=0;i<n-len+1;i++){
            length[len][i]=1;
            for(int j=i+1;j<n-len+1;j++)
                if(same(i,j,len)) length[len][i]++;
        }
    }
    int start,Length;
    for(int len=L;len<=n;len++){
        for(int i=0;i<n-len+1;i++)
            if(length[len][i] > maxn || (length[len][i]==maxn && Length != len)){
                maxn = length[len][i];
                Length = len;
                start = i;
            }
    }
    for(int i=0;i<Length;i++)
        printf("%c",str[start+i]);
    return 0;
}

 

posted @ 2018-03-23 10:30  最美遇见你  阅读(124)  评论(0编辑  收藏  举报