日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

北大OJ百练——4073:最长公共字符串后缀(C语言)

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 北大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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。