生活随笔
收集整理的這篇文章主要介紹了
求一个字符串中连续出现次数最多的子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/imcdragon/article/details/6838565解答二
http://hi.baidu.com/icyday315/item/040aadab454c8a97151073da合并思路(不能重復abcdabcd ?就不行了,abcda是最長重復子串)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
這個題目不是編程珠璣上看到的,但是解法用到的數據結構在編程珠璣上有講到,先歸類到這里。
求一個字符串中連續出現的次數最多的子串。例如字符串“abababc”,最多連續出現的為ab,連續出現三次。要和求一個字符串中的最長重復子串區分開來,還是上面的字符串,那么最長的重復子串為abab。兩個題目的解法有些類似,都用到了后綴數組這個數據結構。求一個字符串中連續出現的次數最多的子串,首先生成后綴數組例如上面的字符串為: abababc bababc ababc babc abc bc c 可以看出第一個后綴數組和第三個后綴數組的起始都為ab,第5個后綴數組也為ab。可以看出規律來,一個字符串s,如果第一次出現在后綴數組i的前面,那么如果它重復出現,下一次出現應該在第i+len(s)個后綴數組的前面。這個規律也不難看出。那么從頭到尾按照這個規律搜索下不難得出結果。下面是代碼:
[cpp]?view plaincopy
#include?<iostream> ?? using ? namespace ?std;?? ?? int ?con_sub( char ?*str,? char ?**ret);?? ?? int ?main()?? {?? ????????char ?str[]?=? "abcabcabcabcabcabbbb" ;?? ????????char ?*ret?=?NULL;?? ????????int ?time?=?con_sub(str,?&ret);?? ????????printf("%s?occuers?%d?times\n" ,?ret,?time);?? ????????return ?0;?? }?? ?? int ?con_sub( char ?*str,? char ?**ret)?? {?? ????????int ?max_time?=?0; ?? ????????int ?ret_len?=?0; ?? ????????char ?*addr?=?NULL; ?? ?? ????????int ?len?=?strlen(str);?? ????????char ?**a?=?( char ?**)malloc( sizeof ( char ?*)*len);?? ?????????? ????????for ( int ?i=0;?i<len;?i++)?? ????????????????a[i]?=?&str[i];?? ?? ?????????? ????????for ( int ?i=1;?i<=(len+1)/2;?i++)?? ????????{?? ?????????????????? ????????????????for ( int ?j=0;?j+i<=len-1;?j+=i)?? ????????????????{?? ????????????????????????int ?k?=?j;?? ????????????????????????int ?temp_time?=?1;?? ????????????????????????while (k+i?<=?len-1?&&?strncmp(a[k],?a[k+i],?i)?==?0)?? ????????????????????????{?? ????????????????????????????????temp_time++;?? ????????????????????????????????k?+=?i;?? ????????????????????????}?? ????????????????????????if (temp_time?>?max_time)?? ????????????????????????{?? ????????????????????????????????max_time?=?temp_time;?? ????????????????????????????????ret_len?=?i;?? ????????????????????????????????addr?=?a[k];?? ????????????????????????}?? ????????????????}?? ????????}?? ????????*ret?=?new ? char [len+1];?? ????????strncpy(*ret,?addr,?ret_len);?? ????????return ?max_time;?? }??
總結
以上是生活随笔 為你收集整理的求一个字符串中连续出现次数最多的子串 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。