兩個字串的最大公共子串行和最大公共子串

2021-07-10 12:04:09 字數 1215 閱讀 5462

1.最大公共子串行

例如:bdcaba和abcbdab的最大公共子串行是bcba。

找兩個遞增下標序列和,使得str1[i1]=str2[j1],str1[i2]=str2[j2],...,str1[ik]=str2[jk]。

用動態規劃來求解:

dp[i][j]來表示str1的前i個元素與str2的前j個元素能夠組成的最大子串行的長度。

str1=bdcaba

str2=abcbdab

則dp[1][1]=0

dp[1][2]=1

dp[3][3]=2

所以可得狀態方程為:

0,    i=0或者j=0

dp[i][j]=               dp[i-1][j-1]+1,  str1[i]==str2[j]

max(dp[i+1][j],dp[i][j+1]) ,其他

實現如下:

#include#include #include #include using namespace std;

int max(int a, int b)

vectorlongestsubseq(char *str1, char *str2)

} return result;

}int main(void)

2.最大公共子串

例如:bdcaba和abcbdab的最大公共子串是bd和ab。

找兩個遞增下標序列和,使得str1[i1]=str2[j1],str1[i2]=str2[j2],...,str1[ik]=str2[jk]。且遞增下標每次增加1。

也可以用動態規劃做,如果 str1[i]==str2[j],則dp[i][j]=dp[i-1][j-1]+1。

如果str1[i]!=str2[j],則dp[i][j]=0。這是區別所在。

#include#include #include #include using namespace std;

int max(int a, int b)

vectorlongestsubseq(char *str1, char *str2)

if (dp[i + 1][j + 1] > max)

}cout << max << endl;

return result;

}int main(void)

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

求兩個串中的第乙個最長子串。如 abractyeyt dgdsaeactyey 的最大子串為 actyet 有乙個演算法很巧妙 把字串1 長度m 橫排,串2 長度n 豎排,得到乙個m n的矩陣c,矩陣的每個元素的值如下,如果m i n j 則c j i 1,否則,c j i 0。然後找出矩陣中連續是...

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

求兩個字串的最大公共子串 演算法原理 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 ...

找出兩個字串的最大公共子串

找出兩個字串的最大公共子串。如 abcdefg和abdefg的最大公共子串是defg 有人給出以下兩種思路 1.以兩個字串c1c2為行列構成矩陣a,相同a i j 為1 最大就是斜方向連續1最多的 另一建議 如果2個字串都很長 那個矩陣占用空間太大了啊,那個矩陣是一般來說是稀疏矩陣 考慮用稀疏矩陣的...