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 }