/*求兩個字串的最大公共子串
演算法原理
lcs[i,j] = 0 (i<0||j<0)
lcs(i-1,j-1) (i>=0 && b>0 && (str1[i]==str2[j]))
(1) 構造乙個str1.size()*str2.size()的矩陣vec
(2) 如果 str1[i] == str2[j],則vec[i][j] = vec[i-1][j-1]+1;
lcs (longest common subsequence) 演算法用於找出兩個字串最長公共子串。
演算法原理:
(1) 將兩個字串分別以行和列組成矩陣。
(2) 計算每個節點行列字元是否相同,如相同則為 1。
(3) 通過找出值為 1 的最長對角線即可得到最長公共子串。
人 民 共 和 時 代
中 0, 0, 0, 0, 0, 0
華 0, 0, 0, 0, 0, 0
人 1, 0, 0, 0, 0, 0
民 0, 1, 0, 0, 0, 0
共 0, 0, 1, 0, 0, 0
和 0, 0, 0, 1, 0, 0
國 0, 0, 0, 0, 0, 0
為進一步提公升該演算法,我們可以將字元相同節點(1)的值加上左上角(d[i-1, j-1])的值,
這樣即可獲得最大公用子串的長度。如此一來只需以行號和最大值為條件即可擷取最大子串。
人 民 共 和 時 代
中 0, 0, 0, 0, 0, 0
華 0, 0, 0, 0, 0, 0
人 1, 0, 0, 0, 0, 0
民 0, 2, 0, 0, 0, 0
共 0, 0, 3, 0, 0, 0
和 0, 0, 0, 4, 0, 0
國 0, 0, 0, 0, 0, 0
*/#include #include #include #include using namespace std;
string lcs(string const &str1,string const & str2)
int iindex = -1;
int imax = 0;
for(int i = 0;i<(int)str1.size();++i)}}
}if(iindex == -1)
return "";
return str1.substr(iindex-imax+1,imax);
}int main()
求兩個字串的最大公共子串
求兩個串中的第乙個最長子串。如 abractyeyt dgdsaeactyey 的最大子串為 actyet 有乙個演算法很巧妙 把字串1 長度m 橫排,串2 長度n 豎排,得到乙個m n的矩陣c,矩陣的每個元素的值如下,如果m i n j 則c j i 1,否則,c j i 0。然後找出矩陣中連續是...
求兩個字串的最大公共子串
題目 求兩個字串的最大公共子串.例如字串a abcdefg 字串b cdeab 分析 從兩個字串的那個較短的字串出發,求其全部子串,判斷每乙個子串是不是那個長串的子串,求子串過程本著由長到段的原則,這樣可以保證第一次匹配到的子串就是最大的公共子串。char get common string cha...
求兩個字串的最大公共字串
今天在csdn上面翻倒乙個問題 求兩個字串的最大公共子串,本來想用有限自動機來做,可惜當年編譯學的不著.b上網翻了翻相關介紹,有乙個演算法很巧妙 把字串1 長度m 橫排,串2 長度n 豎排,得到乙個m n的矩陣c,矩陣的每個元素的值如下,如果m i n j 則c j i 1,否則,c j i 0。然...