最长公共子序列(dp)
计算两个字符串的最长公共子序列的长度,字符不区分大小写。
输入描述:输入两个字符串,分两行输入。
输出描述:输出一个整数。
示例:
输入:
abcfbc
abfcab
输出:4
思路:
dp[i][j] 表示s1字符串前i个字符和s2字符串前j个字符形成的最长公共子序列
* 初始化 dp[0][j]=0; dp[i][0]==0;
* 当s1[i]==s2[j] dp[i][j]=dp[i-1][j-1]+1
* 当s1[i]!=s2[j] dp[i][j]=max(dp[i][j-1],dp[i-1][j]) //具体可以画图 根据i和j建立一个表 依次填表
1 public class 最长公共子序列 { 2 public static void main(String[] args) { 3 Scanner sc=new Scanner(System.in); 4 char[] s1=sc.next().toCharArray(); 5 char[] s2=sc.next().toCharArray(); 6 int len1=s1.length; 7 int len2=s2.length; 8 int dp[][]=new int[len1+1][len2+1]; 9 //下标直接从[1,1]开始 就不用i=0或j=0进行初始化了 10 for(int i=1;i<=len1;i++){ 11 for(int j=1;j<=len2;j++){ 12 if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1; //s1和s2字符串数组的下标从0开始 13 else{ 14 dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]); 15 } 16 } 17 } 18 System.out.println(dp[len1][len2]); 19 } 20 }