对于两个字符串,请设计一个高效算法,求他们的最长公共子序列的长度,这里的最长公共子序列定义为有两个序列U1,U2,U3...Un和V1,V2,V3...Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。
给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。
测试样例:
"1A2C3D4B56",10,"B1D23CA45B6A",12
返回:6
package offer;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public int findLCS(String A, int n, String B, int m) {
// write code here
int [][]dp = new int [n+1][1+m];
char charA[] = A.toCharArray();
char charB[] = B.toCharArray();
for(int i=0;i<m+1;i++) {
dp[0][i] = 0;
}
for(int j =0; j<n+1;j++) {
dp[j][0] = 0;
}
for(int i =1;i<n+1;i++) {
for(int j = 1;j<m+1;j++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
if(charA[i-1]==charB[j-1])
dp[i][j] = dp[i-1][j-1]+1;
}
}
int max =0;
for(int i =0;i<n+1;i++) {
for(int j = 0;j<m+1;j++) {
max = Math.max(max, dp[i][j]);
}
}
return max;
}
}