给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列
输入
"1A2C3D4B56","B1D23A456A"
返回值
"123456"
参考 https://blog.csdn.net/hrn1216/article/details/51534607
Golang实现
func LCS2( str1 string , str2 string ) string {
row := len(str1)
col := len(str2)
if row == 0 || col == 0 {
return ""
}
dp := make([][]int, row+1)
for i:=0;i<row+1;i++{
dp[i] = make([]int, col+1)
}
for i:=0;i<row+1;i++ {
dp[i][0] = 0
}
for i:=0;i<col+1;i++ {
dp[0][i] = 0
}
for i:=1;i<=row;i++{
for j:=1;j<=col;j++{
if str1[i-1] == str2[j-1] {
dp[i][j] = dp[i-1][j-1]+1
}else {
if dp[i][j-1] > dp[i-1][j] {
dp[i][j] = dp[i][j-1]
}else{
dp[i][j] = GetMaxInt(dp[i][j-1] , dp[i-1][j])
}
}
}
}
//因为当前dp[i][j]可以由三种方式得到,分别是 dp[i-1][j-1]+1 ;dp[i][j-1] ; dp[i-1][j]
//并且只有第一种方式才表明当前的 str1[i-1] == str2[j-1]
res := ""
for i, j:=row,col; i>0 && j > 0; {
if str1[i-1] == str2[j-1] {
res = string(str1[i-1]) + res
i--; j--
}else if dp[i][j-1] > dp[i-1][j] {
j--
}else{
i--
}
}
return res
}