zoukankan      html  css  js  c++  java
  • 找核心子字符串问题(暴力 枚举)

    1.
    问题 H: 崩溃的oj
    时间限制: 1 Sec  内存限制: 128 MB
    提交: 211  解决: 96
    [提交][状态][讨论版]
    题目描述

    你们总说

    oj崩了

    oj又打不开了

    但是你们有考虑过

    oj也很辛苦了吗

    oj也很累啊

    你们没有

    你们只想着你们自己

    你们只想着交作业

    //貌似没毛病,剧情反转

    言归正传,不讲段子了,oj最近经常崩溃,他能怎么办,他也很无奈啊,他试图向外界发送着一条包含
    了错误信息由大小写英文字母组成的代码,凑巧的是plyjdz学长收到了这一条消息,他试图破解这条信
    息,然而他发现由于网络原因,其中核心部分出现次数最多,但是比较懒的皮卡丘表示并不想筛选出核
    心代码,于是他决定把这个任务交给学弟学妹们。

     
    输入
        一个字符串由且仅由大小写英文字母组成,长度不超过360。

    输出
     
        输出分为两行

    第一行输出核心字段即出现次数最多的字符子串(子串长度大于等于2)

    第二行输出该字段出现的次数

    样例输入

    emmmmmemmm

    样例输出

    mm
    6




    分析题意:
    找字符串中出现次数最多的子字符串,
    如果有多个出现次数最多的字符子串,输出最长的一个,如果最长的有多个,输出最先出现的。



    暴力破解
    :二重循环,由首和尾字符确定一个字符串(尾字符下标一定大于首字符的)
    三重循环移动查找,四重循环确定查找的字符串相同。

    #include <iostream>
    #include <cstring>
    using namespace std;
    int main()
    {
        char a[361],b[361];
        cin>>a;
        int len=strlen(a);
        int maxnum=0,num;
        int maxlen=0;
        for(int i=0;i<=len-2;i++)             //i指向字符串头部 
            {
                for(int j=i+1;j<=len-1;j++)   //j指向字符串尾部 
                   {
                           num=1;                // i,j确定一个字符串 
                           for(int l=1;l+j<=len-1;l++)   
                               { //向右遍历同长度的字符串:l表示移动的位数,k表示字符串的每一位 
                                   int k;
                                for(k=i;k<=j;k++) 
                                   {    //!!!!!技巧在于每一位的下标表示及循环的指针表示上!!!! 
                                        if(a[i+k-i]!=a[i+l+k-i])
                                           break;
                                   }
                                if(k==j+1)    //for循环到末尾 ,会加一。 
                                    num++;
                            } 
                        if(num>maxnum)
                           {
                                   maxnum=num;
                                maxlen=j-i;
                                for(int p=i;p<=j;p++)
                                    b[p-i]=a[p];     //不应刻意去计算头和尾 
                           }
                        if(num==maxnum)
                            {
                                 if(j-i>maxlen) 
                                    {
                                        maxlen=j-i;
                                        for(int k=i;k<=j;k++)
                                            b[k-i]=a[k];
                                    }
                            }    
                             
                   }
            }
        for(int i=0;i<=maxlen;i++)
            cout<<b[i];
        cout<<endl;
        cout<<maxnum<<endl;
        return 0;
    }
  • 相关阅读:
    过渡效果
    生命周期
    事件处理
    列表的搜索和排序
    DotNetBar for Windows Forms 12.1.0.0_冰河之刃重打包版 原创发布
    DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版
    闲读
    POJ 3253 Fence Repair 贪心 优先级队列
    POJ 2431 Expedition 贪心 优先级队列
    优先级队列-堆-STL实现
  • 原文地址:https://www.cnblogs.com/biggan/p/7435157.html
Copyright © 2011-2022 走看看