找核心子字符串問題(暴力 枚舉)
阿新 • • 發佈:2017-08-26
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; }
找核心子字符串問題(暴力 枚舉)