最长公共子序列(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 }

 

posted @ 2021-03-23 09:58  nb小歪  阅读(86)  评论(0编辑  收藏  举报