• 算法训练 字串统计


      算法训练 字串统计  
    时间限制: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中所有字符都是小写英文字母。
    提示
      枚举所有可能的子串,统计出现次数,找出符合条件的那个


    思路:抽出子串,暴力+结构体排序  n<=60,最多只会有1830种结果

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    using namespace std;
    const int MAXN=2000;
    struct node
    {
        string str;
        int len;
        int cnt;
        int pos;
        node()
        {
            str="";
            len=0;
            cnt=0;
            pos=0;
        }
    }ans[MAXN];
    bool cmp(node a, node b)
    {
        if(a.cnt>b.cnt)
            return true;
        else if(a.cnt==b.cnt)
        {
            if(a.len>b.len)
                return true;
            else if(a.len==b.len)
            {
                return a.pos<b.pos;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    void slove(int l, string s)
    {
        int length=s.length();
        int countnumber=0;
        for(int i=l;i<=length;i++)
        {
            for(int j=0;j<=length-i;j++)
            {
                string ss=s.substr(j,i);
                int flag=0;
                for(int k=0;k<=countnumber;k++)
                {
                    if(ans[k].str==ss)
                    {
                        ans[k].cnt++;
                        flag=1;
                        break;
                    }
                }
                if(!flag)
                {
                    ans[countnumber].str=ss;
                    ans[countnumber].len=ss.length();
                    ans[countnumber].cnt=1;
                    ans[countnumber].pos=countnumber;
                    countnumber++;
                }
            }
        }
        sort(ans,ans+countnumber+1,cmp);
        cout<<ans[0].str<<endl;
    }
    int main()
    {
        string s;
        int l;
        scanf("%d",&l);
        cin>>s;
        slove(l,s);
        return 0;
    }
    


  • 相关阅读:
    初识现代软件工程——构建之法
    个人作业3——个人总结(Alpha阶段)
    结对编程2
    个人作业2——英语学习APP案例分析
    结对作业1
    java四则运算
    个人附加作业
    个人作业3——个人总结(Alpha阶段)
    结对编程2——单元测试
    个人作业2——英语学习APP案例分析
  • 原文地址:https://www.cnblogs.com/lemonbiscuit/p/7776026.html
Copyright © 2020-2023  润新知