例如字符串“abcfbc”和“abfcab”,其中“abc”同時出現在兩個字符串中,因此“abc”是它們的公共子序列。此外,“ab”、“af”等都是它們的字串。
現在給你兩個任意字符串(不包含空格),請幫忙計算它們的最長公共子序列的長度。
輸入描述:
輸入包含多組數據。
每組數據包含兩個字符串m和n,它們僅包含字母,並且長度不超過1024。
輸出描述:
對應每組輸入,輸出最長公共子序列的長度。
輸入
abcfbc abfcab
programming contest
abcd mnp
輸出
4
2
0
package 最長公共子序列;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
String A = scanner.next();
String B = scanner.next();
System.out.println(getMaxLen(A, B));
}
}
//遞歸法
public static int getL(String A,String B,int ia,int ib){
if(ia==A.length()||ib==B.length())
return 0;
int res = 0;
//若A當前ia==B當前ib,那麼對比下一個
if(A.charAt(ia)==B.charAt(ib)){
res+=getL(A, B, ia+1, ib+1)+1;
}else{//若A當前ia!=B當前ib
//那麼ia走下一個或ib走下一個,取他們當中最大值
return Math.max(getL(A, B, ia+1, ib), getL(A, B, ia, ib+1));
}
return res;
}
//遞歸轉dp
public static int getMaxLen(String A,String B){
int n = A.length();
int m = B.length();
int dp[][] = new int[n+1][m+1];
for(int i=n-1;i>=0;--i){
for(int j=m-1;j>=0;--j){
if(A.charAt(i)==B.charAt(j)){
dp[i][j]=dp[i+1][j+1]+1;
}else{
dp[i][j]=Math.max(dp[i+1][j], dp[i][j+1]);
}
}
}
return dp[0][0];
}
}