最长公共子序列lcs
最长公共子序列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()]);
    }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号