出現次數最多的子字串? 其實沒那麼複雜

2021-04-17 01:36:22 字數 3015 閱讀 7226

【有興趣的網友可以參閱我的另一篇文章《

一次遍歷找出「出現次數最多的子串」 》——對本文演算法的改進。】

求乙個字串中出現次數最多的子串,子串的長度可以是 1 。

乍一看,好像無處下手。簡單的窮舉效率太低,隨著輸入的文字增長,時間複雜度和空間複雜度就會火箭般竄公升至無法接受的地步。

我們需要尋找規律。

假設存在乙個長度為 n 的子串 s 出現的次數最多。那麼它具有哪些特點呢?

「s 中不會出現重複的字元」,「組成 s 的每乙個字元、每乙個子串的出現次數都和 s 一樣」!

有了這個結論,問題就簡單了。

找到文字中的出現次數最高的單個字元組成的子串,放入乙個佇列中,

從佇列的頭部開始,對結果集中的每乙個子串 s 進行處理

找到文字中該子串出現的任意乙個位置 p,

判斷文字中緊隨 s 之後的字元 c 是否的出現次數是最多的,

如果 c 的出現次數不是最多的,結束。

如果 c 的出現次數是最多的,搜尋文字中的每乙個 s 並判斷緊隨其後的字元是否是 c,

如果文字中的每乙個 s 之後都存在字元 c ,將 s + c 生成的子串放入結果集中,

如果文字中出現 s 之後的字元不是 c ,結束。

如此,直至到達佇列尾。

#pragma

warning(disable : 4786)

#include 

<

iostream

>

#include 

<

string

>

#include 

<

deque

>

#define

buffsize 1024

using

std::cout;

using

std::endl;

using

std::

string

;using

std::deque;

typedef deque

<

string

>

strlist;

const

string

::size_type npos =-

1;const

string

ignorechars(

"/t/n/r");

inline bool

ignorechar(

char

c)/*

* 統計字元出現次數

*/unsigned charsummary(

const

string

&text, unsigned usecount, 

inttbllen)

return

count;}/*

* 試著增長字串

*/char

trygrowthstring(

const

string

&text, 

const

string

&str, 

intmaxcount, unsigned

*usecount)

return

count < maxcount ? 0 : c;

}void

printresult(

const

strlist

&result)

cout

<<

"-------------------------------------

"<<

endl;

cout

<<

"total : 

"<<

result.size()

<<

endl;

}void

main(

void)/*

* 統計字元出現次數

*/count 

=charsummary(text, usecount, 

sizeof

(usecount) 

/sizeof(*

usecount));

cout

<<

"max count :

"<<

count

<<

endl;if(

0==count)

/** 將出現次數最多的字元作為子串放入結果中

*/for

(i =

0;i 

<

sizeof

(usecount) 

/sizeof(*

usecount);i++)

/** 查詢更多的子串

*/for

(strlist::iterator iter 

=result.begin();iter 

!=result.end();iter++)

printresult(result);

cout

<<

"bye!

"<<

endl;}

測試輸入:

abcdefg

bcdef

hijklmnopqrstabcdefg

輸出:

max count :3

the result substrings :

-------------------------------------""

"b""c"

"d""e"

"f""bc"

"cd"

"de"

"ef"

"bcd"

"cde"

"def"

"bcde"

"cdef"

"bcdef"

-------------------------------------

total : 16

bye!

【更快速的演算法請參閱:《

一次遍歷找出「出現次數最多的子串」 》】

找出字串中連續出現次數最多的子串

基本演算法描述 給出乙個字串abababa 1.窮舉出所有的字尾子串 substrs 0 abababa substrs 1 bababa substrs 2 ababa substrs 3 baba substrs 4 aba substrs 5 ba substrs 6 a 2.然後進行比較 s...

查詢字串中出現次數最多的字元

如下 include using namespace std typedef struct nodesnode 返回次數最多的字元節點,從大到小排阿node 0 c count最大 snode checkcount snode node,int len for int i 0 i len 1 i s...

計算出出現次數最多的字串

因為這個題目意思太簡單了,看一下案例就懂了便不再描述了。注意有多組測試案例,每組案例的字串數量n 0輸入 5 green redblue redred 3pink orange pink0 輸出 red pink 解題 include include includeusing namespace s...