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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

九度OJ 重复子串

發布時間:2025/6/15 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 九度OJ 重复子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:

給定一個由小寫字母組成的字符串,求它的所有連續子串中,出現過至少兩次,且至少有一對出現的重復子串是不重合的連續子串個數。
如給定字符串aaaa,aa和a,符合條件,aaa不符合條件(出現重合),故答案為2。

?

輸入:

輸入包含多組測試用例,每組測試用例包含一個字符串,由小寫字母組成,其長度不大于1000。

?

輸出:

對于每組測試數據,輸出一個整數,代表符合條件的子串個數。

?

樣例輸入:
aaaa aaa
樣例輸出:
2 1剛開始的時候,想到遍歷每個字符子串,比如從位置1開始,依次遍歷長度從1到n的子串,需要N^2。然后從位置2開始,依次遍歷長度從1到n的子串,需要N^2。如果依次遍歷完,總共O(N^3).字符串最長為1000,明顯超過10^7數量級。就沒有向下思考。 但是,仔細觀察題目要求,會發現字符串是由小寫字母組成的。那么如果長度很長,那么必然會有大量的重復字符串。而且,題目要求我們只需要找出滿足條件的字符子串種類型,所以,如果我們采用枚舉遍歷,將曾經遍歷過的字符子串標記出來,那么以后碰見這樣的字符子串,就不需要重復遍歷了。這樣,必然可以講數量級直接降到很低。 然后我們觀察,如果i開始,長度為l的字符子串沒有匹配,那么i開始,長度為l+1的,直接break,跳到i+1。這樣又可以剪枝。 思路:窮舉+剪枝,(1).枚舉起點i和長度L,mark[i][L]表示這個字符串是否處理過,處理過不再處理,(2).若i位置上長L的串不可以,則更長的串也不可以,直接break L到下一個i



#include <stdio.h> #include <string.h>const int MAX = 1002;int main() {bool mark[MAX][MAX];char str[MAX];while(scanf("%s", str) != EOF){int len = strlen(str);for(int i = 0; i <= len ; i++){for(int j = 0; j <= len; j++)mark[i][j] = false;}int ans = 0;for(i = 0; i < len; i++){//如果i開始,j的長度的子串超過了字符串長度,那么,應該直接跳過。for(int j = 1; j < len && i + j <= len; j++){int hasMatch = 0;//如果從i開始,長度為j的字符串子串檢查過,那么直接開始j+1的子串檢查if(mark[i][j] == true)continue;//對從i開始,長度為j的字符串子串進行遍歷。for(int k = i + j; k <= len - j; k ++){//對已經標記過得子串(k,j),說明以前已經被匹配過,就不能再次進行匹配了if(mark[k][j] == true)continue;if(strncmp(str + i, str + k, j) == 0){mark[k][j] = true;hasMatch = 1;}}//遍歷一遍之后進行統計mark[i][j] = true;ans += hasMatch;if(hasMatch == 0)break;}}printf("%d\n", ans);}return 0; }


總結

以上是生活随笔為你收集整理的九度OJ 重复子串的全部內容,希望文章能夠幫你解決所遇到的問題。

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