北大OJ百练——4073:最长公共字符串后缀(C语言)
剛剛看到一道北大的OJ題,很簡單的一道題。原題如下(偷個懶,直接截圖):
看完這道題,我想大家都和我一樣覺得這道題很簡單,事實也是如此,畢竟通過率很高。
我先來說一下我的思路吧。我是想先把這些所有的字符串都得到,然后再去比較相鄰的兩個字符串相同后綴。
也就是第0個和第1個比較,第1個和第2個比較,第2個和第3個比較。。。。。如此反復比較了N-1次。
不過我們要求的是所有的字符串中的最長后綴,那么我們還差的一步就是比較得到這些字符中最短的一個,在這個程序中我是用一個參數在記錄后綴的長度來實現最長的一個后綴。原因也很簡單,因為既然是相同后綴,那么這個后綴一定是大家都有的,既然大家都有,那我隨便用哪一個都不會有什么妨礙。那不妨就用第0個字符串來取得從第strlen(str[0])-minBackwards到第strlen(str[0])-1個就行了。如下是我的代碼:
<span style="font-family:Courier New;font-size:18px;">#include <stdio.h> #include <string.h> #define MAXLENGTH 200// 比較兩個字符串的最長后綴 int compareSuffix(char a[], char b[]) {int len_a, len_b;len_a = strlen(a);len_b = strlen(b);int backwards = 0;int pa, pb;// 取兩個字符串最短的為標準來從后向前遍歷for (pa = len_a-1, pb = len_b-1; (pa >= 0)&&(pb >= 0); --pa, --pb){if(a[pa] == b[pb]){++backwards;}else break;}return backwards; }int main() {int n, i;while(scanf("%d", &n)!=0){char str[MAXLENGTH][MAXLENGTH];// 輸入n個字符串for(i = 0; i < n; ++i){scanf("%s", str[i]);}int backwards = 0;int minBackwards = 300;// 依次比較兩個字符串的相同后綴,找出最短的那個相同后綴for (i = 0; i < n - 1; ++i){backwards = compareSuffix(str[i], str[i+1]); if (backwards <= minBackwards)minBackwards = backwards;} if(minBackwards){for (i = strlen(str[0])-minBackwards; i < strlen(str[0]); ++i){printf("%c", str[0][i]);}} printf("\n");}return 0; }</span><span style="font-family:SimSun;font-size:18px;"> </span>不過很遺憾,報了一個錯,Output Limit Exceeded
現在分析可能是時間上出了問題,可是當我修改了代碼之后發現還是同樣的錯誤。于是,我再去看代碼,感覺還是沒有錯的。上網查了一下,發現可能是我的while()循環出了問題,于是我就用上面的代碼來測試了一下,果然不出所料。當我在第一次輸入0的時候就出現了亂碼,如果是前幾次正常,那么后來輸入0的時候,不會退出。
于是我就把while()循環中的語句修改了一下:
<span style="font-family:SimSun;font-size:18px;"> </span><span style="font-family:Courier New;font-size:18px;">while(1){scanf("%d", &n);if(!n) break;......................}</span>雖然這樣修改后可以通過,不過我還是不太清楚為什么之前的代碼就是一個Output Limit Exceeded
如果你看到了我這篇博客,并且知道這是為什么,可以給我評論留言。大家一起探討一下。
原題連接:4073:最長公共字符串后綴(Longest String Postfix)
總結
以上是生活随笔為你收集整理的北大OJ百练——4073:最长公共字符串后缀(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北大OJ百练——4074:积水量(C语言
- 下一篇: 模拟网络通信中存储转发的分组交换算法