最长公共子序列lcs
题目描述
一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。
输入格式
第一行两个字符串用空格分开。
输出格式
最长子串的长度。
样例输入
abccd aecd
样例输出
3
解题思路
采用动态规划的方法。
dp[i][j]
表示长度为i
和j
的两个子串的最长子串长度。
状态转移方程
- 若是两个串的最后两位相同,那么
dp[i][j]
=dp[i-1][j-1]
+1
例如:abced
abcd
abce
和abc
的最长公共子串长度为3,当d=d
时,最长公共子串长度为3+1=4
- 若是最后两位不相同,则
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
例如:abcde
abcd
dp[i][j]=dp[i-1][j]
abcd
abcde
dp[i][j]=dp[i][j-1]
代码
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String a = scanner.next();String b = scanner.next();int[][] dp=new int[a.length()+1][b.length()+1];for(int i=1;i<=a.length();i++){Arrays.fill(dp[i],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)){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);}}}System.out.println(dp[a.length()][b.length()]);}
}