Question:
Find the longest common sub-sequence in two strings, and return its length.
分析:
youtube上三哥的视频做的不错,讲解清晰。
这道题可以用递归,可以用DP。思想相差不多,base case是有一个string遍历到无,返回零;其他情况有,当前遍历位置两个字符串character相同,返回1+下一层递归;如果不相等,返回两个字符串下一层递归中较大的一个。
代码:
//LCS, Recursion
public int recImp(String str1, String str2){
if(str1.length()==0 || str2.length()==0) return 0;
if(str1.charAt(0)==str2.charAt(0)) return 1+LCS(str1.substring(1), str2.substring(1));
else return Math.max(LCS(str1.substring(1), str2), LCS(str1, str2.substring(1)));
}
//LCS, DP
public int LCS(String str1, String str2){
int m = str1.length(), n = str2.length();
int[][] matrix = new int[m+1][n+1];
for(int i=0; i<m; i++) matrix[i][0] = 0;
for(int j=0; j<n; j++) matrix[0][j] = 0;
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++){
if(str1.charAt(i-1)==str2.charAt(j-1)) matrix[i][j] = 1+matrix[i-1][j-1];
else matrix[i][j] = Math.max(matrix[i-1][j], matrix[i][j-1]);
}
return matrix[m][n];
}
总结:
LCS,经典题目。