题解 | #最长公共子序列(二)#
最长公共子序列(二)
http://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11
- 求dp数组
- 倒推序列 倒推逻辑: 如果i-1和j-1位置的字符一样,记录到结果中; 如果不一样,那么当前dp[i][j]的值必定是来自上方和左边的值。如果dp[i - 1][j] >= dp[i][j - 1],说明序列来自i-1和j的这一段,所以i需要--;同理,j--
import java.util.*;
public class Solution {
/**
* longest common subsequence
* @param s1 string字符串 the string
* @param s2 string字符串 the string
* @return string字符串
*/
public String LCS (String text1, String text2) {
// write code here
char[] str1 = text1.toCharArray();
char[] str2 = text2.toCharArray();
int N = str1.length;
int M = str2.length;
int[][] dp = new int[N + 1][M + 1];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
int i = N, j = M;
StringBuilder sb = new StringBuilder();
while (i > 0 && j > 0) {
if (str1[i - 1] == str2[j - 1]) {
sb.append(str1[i - 1]);
i--;
j--;
} else {
if (dp[i - 1][j] >= dp[i][j - 1]) {
i--;
} else {
j--;
}
}
}
String ans = sb.reverse().toString();
return ans.equals("") ? "-1" : ans;
}
}