查詢N個字串(環)的最長公共子串行

2021-09-29 21:56:56 字數 3943 閱讀 1981

拓展:n個字元環,求最長公共子串行?

其他說明:

理論知識:

二進位制模擬串實現暴力破解——暴力列舉出(最長)公共子串行

**實現:

#include

#include

#include

#include

#include

#include

using

namespace std;

// 判斷字串subseq中的每乙個字元在字串str中的出現順序是否為遞增

bool

issubsequence

(const string& str,

const string& subseq)

}return

true;}

// 多串的公共子串行判斷;

bool

iscomseq

(const vector

& vs,

const string& subseq)

}return

true;}

// 2 ^ 64 是上限,故 只能處理母串長度 <64 的情況;

intmain()

} clock_t starttime =

clock()

;// 確保遍歷的是短字串的所有子串行,並且是採用剔除元素的方式、自長到短遍歷

int len = s_little.

length()

;int cont =

1<< len;

string subseq;

// 臨時儲存子串行;

set ss;

// 儲存所有公共子串行;

int longest =0;

// 最長公共子串行長度;

bool flag =

false

;// 公共子串行是否存在;

// i 將會直接影響到選擇子集元素個數的多少(二進位制表示);

for(

int i = cont -

1; i >=0;

--i)

}//cout << "subseq = " << subseq << endl;

// 接著判斷 s_little 的子串行 subseq 是否也同時是 其他字串 的子串行;if(

iscomseq

(vs,subseq))}

subseq.

clear()

;// 記得重置為空;

}// 不存在公共序列則輸出空串;

//if (ss.empty())

else}}

// 重置容器為空;

s_little.

clear()

; vs.

clear()

;// ss.clear(); // ss 是區域性宣告,清空沒有必要;

// longgest = 0; 同理;

cout <<

"總共耗時:"

<<

double

(clock()

- starttime)

/ clocks_per_sec <<

"s"<< endl;

}return0;

}

測試樣例:

滑鼠置於此處可預覽(chrome)

**實現:

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

// 判斷字串subseq中的每乙個字元在字串str中的出現順序是否為遞增

bool

issubsequence

(const string& str,

const string& subseq)

}return

true;}

// 字串轉字元環;

vector

stringtoring

(const string& str)

// 乙個字元環 包含 n個與源字串等長的字串(n為源字串的元素個數,即長度);

assert

(vs.

size()

== str.

length()

);return vs;

}// 多個字元環的公共子串行判斷;

bool

iscomseq

(const vector

& vs,

const string& subseq)

}// 當前環找不著該序列;if(

!flag)

}return

true;}

// 2 ^ 64 是上限,故 只能處理母串長度 <64 的情況;

intmain()

} clock_t starttime =

clock()

; string subseq;

// 臨時儲存子串行;

set ss;

// 儲存所有公共子串行;

int longest =0;

// 最長公共子串行長度;

bool flag =

false

;// 公共子串行是否存在;

for(string item :

stringtoring

(s_little))}

//cout << "subseq = " << subseq << endl;

// 接著判斷 s_little 的子串行 subseq 是否也同時是 其他字串 的子串行;if(

iscomseq

(vs, subseq))}

subseq.

clear()

;// 記得重置為空;}}

// 不存在公共序列則輸出空串;

//if (ss.empty())

else}}

// 重置容器為空;

s_little.

clear()

; vs.

clear()

; ss.

clear()

;// ss 是區域性宣告,清空沒有必要;

longest =0;

// 同理;

cout <<

"總共耗時:"

<<

double

(clock()

- starttime)

/ clocks_per_sec <<

"s"<< endl;

}return0;

}

測試樣例:

滑鼠置於此處預覽(chrome)

題目補充:

acm-icpc 2018 北京賽區網路預賽 tomb raider

特別說明:

該考題的輸出僅僅是乙個acsll碼最小的最長公共子串行串,

自己的測試是左右公共子串行。

有上述 從n個字串找最長公共子串行,到n個字元環找最長公共子串行的過程可以發現:環的公共子串行的結果數量明細增多。

並且值得注意的是:

**證容易被遺漏的地方是, s_little也需要先生成對應的字元環(多個字串),再各自去生成各自的所有子串行,然後拿來校驗。

而不是僅僅針對 s_little 的源字串生成所有子串行。

其他說明:

部落格補充以強化理解:

助你深刻理解——最長公共子串、最長公共子串行(應該是全網數一數二的比較全面的總結了)

****:[email protected]

2019/11/24 20:43

多個字串的最長公共字串

如果所有字串的長度之和是l,則下面介紹的這個演算法的平均效率o l logl 但是最壞情況下可能會再乘以o l l是每個字串的平均長度。首先對於每個字串,取出以每個字元開頭,到字串尾的子串。比如字串 acb 從中取出的子串有 acb cb 和 b 如果所有字串的總長度為l,則總共就有l個子串。我們把...

求2個字串的最長公共子串長度

題目 給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。輸入描述 輸入資料有多組,每組包含乙個字串s,且保證 1 s.length 1000.輸出描述 對於每組資料,輸出乙個整數,代表最少需要刪除的字元個數。輸入例子 abcda ...

求兩個字串的最長公共子串

問題 有兩個字串str和str2,求出兩個字串中最長公共子串長度。比如 str acbcbcef,str2 abcbced,則str和str2的最長公共子串為bcbce,最長公共子串長度為5。演算法思路 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的...