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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

求一个字符串中连续出现次数最多的子串

發(fā)布時(shí)間:2025/4/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求一个字符串中连续出现次数最多的子串 小編覺(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ù)子串)

  • /*?
  • ??Author:?Mcdragon?
  • ??Date:?15-07-11?21:17?
  • ??Description:?求一個(gè)字符串中連續(xù)出現(xiàn)次數(shù)最多的子串.??
  • ?
  • 基本算法描述:?
  • ????給出一個(gè)字符串a(chǎn)bababa??
  • ????1.窮舉出所有的后綴子串?
  • ????????substrs[0]?=?abababa;?
  • ????????substrs[1]?=?bababa;?
  • ????????substrs[2]?=?ababa;?
  • ????????substrs[3]?=?baba;?
  • ????????substrs[4]?=?aba;?
  • ????????substrs[5]?=?ba;?
  • ????????substrs[6]?=?a;?
  • ????2.然后進(jìn)行比較?
  • ????????substrs[0]比substrs[1]多了一個(gè)字母,如果說(shuō)存在連續(xù)匹配的字符,那么?
  • ????????substrs[0]的第1個(gè)字母要跟substrs[1]首字母匹配,同理?
  • ????????substrs[0]的前2個(gè)字母要跟substrs[2]的前2個(gè)字母匹配(否則不能叫連續(xù)匹配)?
  • ????????substrs[0]的前n個(gè)字母要跟substrs[n]的前n個(gè)字母匹配.?
  • ????????如果匹配的并記下匹配次數(shù).如此可以求得最長(zhǎng)連續(xù)匹配子串.??????
  • */??
  • 這個(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;//連續(xù)出現(xiàn)的最多次數(shù)??
  • ????????int?ret_len?=?0;//連續(xù)出現(xiàn)的字符串的長(zhǎng)度??
  • ????????char?*addr?=?NULL;//連續(xù)出現(xiàn)字符串的起始地址??
  • ??
  • ????????int?len?=?strlen(str);??
  • ????????char?**a?=?(char?**)malloc(sizeof(char?*)*len);??
  • ????????//生成后綴數(shù)組??
  • ????????for(int?i=0;?i<len;?i++)??
  • ????????????????a[i]?=?&str[i];??
  • ??
  • ????????//重復(fù)字符串的長(zhǎng)度范圍為1到(len+1)/2??
  • ????????for(int?i=1;?i<=(len+1)/2;?i++)??
  • ????????{??
  • ????????????????//當(dāng)重復(fù)的字符串長(zhǎng)度為i的時(shí)候,如果是連續(xù)出現(xiàn)的,那么第j和第j+i個(gè)后綴數(shù)組前面為重復(fù)的字符串??
  • ????????????????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ò),歡迎將生活随笔推薦給好友。