看到不少人面试时被问了,以防万一,写一个练练手。
package com.Thread.Learn;
import java.util.Arrays;
/*
* author:Tammy Pi
* function:利用动态规划的方式解答最长公共子序列
*/
public class LongestSubstr {
//最长公共子序列的原理
//对于两个字符串A(m)和B(n),如果Z(p)是这两个序列的最长公共子序列
//如果Am=Bn,那么Zp=Am且Zp=Bn
//如果Am!=Bn,且A(m-1)与B(n)的最长公共子序列大于A(m)与B(n-1)的最长公共子序列,那么Z(p)为A(m-1)与B(n)的最长公共子序列
//否则Z(p)为A(m)与B(n-1)的最长公共子序列
public void getLongest(String a,String b){
int[][] m = new int[a.length()+1][b.length()+1];
int[][] record = new int[a.length()+1][b.length()+1];
m[0][0] = 0;
for(int i=1;i<=a.length();i++){
m[i][0] = 0;
}
for(int j=1;j<=b.length();j++){
m[0][j] = 0;
}
for(int i=1;i<=a.length();i++){
for(int j=1;j<=b.length();j++){
if(a.charAt(i-1)==b.charAt(j-1)){
m[i][j] = m[i-1][j-1] + 1;
record[i][j] = 1;
}else if(m[i-1][j]>m[i][j-1]){
m[i][j] = m[i-1][j];
record[i][j] = 2;
}else if(m[i][j-1]>m[i-1][j]){
m[i][j] = m[i][j-1];
record[i][j] = 3;
}
}
}
print1(a,b,record,a.length(),b.length());
}
public void print1(String a,String b,int[][] m,int i,int j){
if(i==0||j==0){
return;
}
if(m[i][j]==1){
print1(a,b,m,i-1,j-1);
System.out.print(a.charAt(i-1));
}else if(m[i][j]==2){
print1(a,b,m,i-1,j);
}else if(m[i][j]==3){
print1(a,b,m,i,j-1);
}
}
public static void main(String[] args){
LongestSubstr str = new LongestSubstr();
str.getLongest("abcffcba","abcecba");
}
}