生活随笔
收集整理的這篇文章主要介紹了
求一个字符串中连续出现次数最多的子串
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://blog.csdn.net/imcdragon/article/details/6838565解答二
http://hi.baidu.com/icyday315/item/040aadab454c8a97151073da合并思路(不能重復(fù)abcdabcd ?就不行了,abcda是最長(zhǎng)重復(fù)子串)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
這個(gè)題目不是編程珠璣上看到的,但是解法用到的數(shù)據(jù)結(jié)構(gòu)在編程珠璣上有講到,先歸類到這里。
求一個(gè)字符串中連續(xù)出現(xiàn)的次數(shù)最多的子串。例如字符串“abababc”,最多連續(xù)出現(xiàn)的為ab,連續(xù)出現(xiàn)三次。要和求一個(gè)字符串中的最長(zhǎng)重復(fù)子串區(qū)分開(kāi)來(lái),還是上面的字符串,那么最長(zhǎng)的重復(fù)子串為abab。兩個(gè)題目的解法有些類似,都用到了后綴數(shù)組這個(gè)數(shù)據(jù)結(jié)構(gòu)。求一個(gè)字符串中連續(xù)出現(xiàn)的次數(shù)最多的子串,首先生成后綴數(shù)組例如上面的字符串為: abababc bababc ababc babc abc bc c 可以看出第一個(gè)后綴數(shù)組和第三個(gè)后綴數(shù)組的起始都為ab,第5個(gè)后綴數(shù)組也為ab。可以看出規(guī)律來(lái),一個(gè)字符串s,如果第一次出現(xiàn)在后綴數(shù)組i的前面,那么如果它重復(fù)出現(xiàn),下一次出現(xiàn)應(yīng)該在第i+len(s)個(gè)后綴數(shù)組的前面。這個(gè)規(guī)律也不難看出。那么從頭到尾按照這個(gè)規(guī)律搜索下不難得出結(jié)果。下面是代碼:
[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;?? }??
總結(jié)
以上是生活随笔 為你收集整理的求一个字符串中连续出现次数最多的子串 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。