package main
// 抄的上一个题解
func LCS( s1 string , s2 string ) string {
m, n := len(s1), len(s2)
// // dp保存当前最长公共子序列长度
dp := make([][]int, m+1)
for i := range dp {
dp[i] = make([]int, n+1)
}
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if s1[i-1] == s2[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
}
}
}
// 反推转移转移公式得到最长公共子序列
// dp[i][j] > 0 表示存在最长公共子序列
res := ""
for i, j := m, n; dp[i][j] > 0; {
// 反推 s[i] == s[j] 相等场景
if s1[i-1] == s2[j-1] { // 该字符一定被选取!
res = string(s1[i-1]) + res
i, j = i-1, j-1
} else if dp[i-1][j] > dp[i][j-1] {
// 如果 dp[i][j] 是取自 dp[i-1][j] 那只是往这个方向移动
i = i-1
} else if dp[i-1][j] <= dp[i][j-1] {
j = j-1
}
}
if dp[m][n] == 0 {
return "-1"
}
return res
}
func max(a,b int) int { if a < b { return b }; return a }