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

2021-06-18 12:57:56 字數 1283 閱讀 8804

/*求兩個字串的最大公共子串 

演算法原理

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。然...