找核心子字符串问题(暴力 枚举)

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;
}
原文地址:https://www.cnblogs.com/biggan/p/7435157.html