蓝桥杯javaC组——算法提高【最长公共子序列】

举报
发表于 2022/02/21 10:22:27 2022/02/21
【摘要】 蓝桥杯试题 动态规划 DP

【ADV-317 最长公共子序列】

地址:“蓝桥杯”练习系统

问题描述

  给定两个字符串,寻找这两个字串之间的最长公共子序列。

输入格式

  输入两行,分别包含一个字符串,仅含有小写字母。

输出格式

  最长公共子序列的长度。

样例输入

abcdgh
aedfhb

样例输出

3

样例说明

  最长公共子序列为a,d,h。

数据规模和约定

  字串长度1~1000。

解题思路
两个字符串动态查找即可

【注意·要点】

1.序列和数列的区别:数列的排列是连续且顺序固定的,而序列是可以不连续但是次序不能更改的。


2. dp循环的判断条件注意是动态继承,即继承是字符串的长度不断从小再到大,这也是dp能抽象解决问题的特点


【代码】

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        sc.close();
        //dp状态数组
        int dp[][] = new int[a.length()+1][b.length()+1];//0行和0列 为0
        //循环查找公共子序列
        for (int i = 1; i < dp.length; i++) {//字符串a
            for (int j = 1; j < dp[0].length; j++) {//字符串b
                if(a.charAt(i-1) == b.charAt(j-1)) 
                    dp[i][j] = dp[i-1][j-1]+1;    ///公共子序列长度+1
                else 
                    //继承两个字符串当前长度的最大公共子序列
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]); 
            }
        }
        System.out.println(dp[a.length()][b.length()]);
    }
 
}
动态规划经典

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。