拓展: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 比較二維矩陣中每個點對應行列字元中否相等,相等的...