最长公共子序列lcs

最长公共子序列lcs

题目描述

一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。

输入格式

第一行两个字符串用空格分开。

输出格式

最长子串的长度。

样例输入

abccd aecd

样例输出

3

解题思路

采用动态规划的方法。

dp[i][j]表示长度为ij的两个子串的最长子串长度。

状态转移方程

  1. 若是两个串的最后两位相同,那么dp[i][j]=dp[i-1][j-1]+1

例如:abced abcd abceabc的最长公共子串长度为3,当d=d时,最长公共子串长度为3+1=4

  1. 若是最后两位不相同,则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()]);

    }
}
posted @ 2025-03-10 17:33  狐狸胡兔  阅读(5)  评论(0)    收藏  举报