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個字串都很長 那個矩陣占用空間太大了啊,那個矩陣是一般來說是稀疏矩陣 考慮用稀疏矩陣的...