1. 程式人生 > >找核心子字符串問題(暴力 枚舉)

找核心子字符串問題(暴力 枚舉)

color strlen 打不開 div 指向 其中 他能 提交 n)

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; }

找核心子字符串問題(暴力 枚舉)