【有興趣的網友可以參閱我的另一篇文章《
一次遍歷找出「出現次數最多的子串」 》——對本文演算法的改進。】
求乙個字串中出現次數最多的子串,子串的長度可以是 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...