当前位置: 首页 > news >正文

最长公共子序列问题

就是两个字符串求他们的最长公共子序列比如123   和231 最长公共子序列就是23,

就是用动态规划来实现,动态规划的一般逻辑,首先实现一个或者几个最简单的情况,然后再写出复杂情况到简单情况的转化关系,就可以得到结果了。

此题中简单情况就是两个字符串只有一个字符,然后直接判断他们是否相等,如果相等返回1,不等返回0,复杂情况比如12 和 1  ,可以转化成简单方法,

第一个字符串的第一个字符和第二个字符串的第一个字符比的结果加上第一个字符串的第二个字符 和空白比较,

第一个字符串的第一个字符和空白比加上 第一个字符串的第二个字符和第二个字符串的第一个字符。

比较结果取最大的作为最终结果

就可以得到一张矩阵图,而结果需要沿着矩阵图行走,行走规则就是从右下往左上走,如果数字有变化,则说明这个字符是在公共子序列中。

我犯了一个错误就是路线一定要按照先行后列 或者先列后行的顺序,不能一会行先一会列先,

生成结果二维数组的方法:

 static int solve(char[] first, char[] second, int firstindex, int secondindex, Integer[][] result) {
        if (firstindex < 0 || secondindex < 0) {
            return 0;
        }
        if (result[firstindex][secondindex] != null) {
            return result[firstindex][secondindex];
        } else {
            if (firstindex == secondindex && firstindex == 0) {
                int num = first[firstindex] == second[secondindex] ? 1 : 0;
                result[firstindex][secondindex] = num;
                return num;
            } else {
                char firstchar = first[firstindex];
                char secondchar = second[secondindex];
                int left = 0;
                int right = 0;
                int both = 0;
                left = solve(first, second, firstindex - 1, secondindex, result);
                right = solve(first, second, firstindex, secondindex - 1, result);

                both = solve(first, second, firstindex - 1, secondindex - 1, result) + (firstchar == secondchar ? 1 : 0);
                result[firstindex][secondindex] = Math.max(Math.max(left, right), both);
                return result[firstindex][secondindex];
            }
        }
    }

生成最长公共子序列的方法(这个是抄的)

逻辑就是如果右下角的数据和上面的数据相等,就先向上移动,如果右下角和左边数据相等 再考虑向左边移动,其他情况就向左上移动,就是我刚刚说的必须要按照先行后列 或者先列后行的顺序

 private static String lcse(Integer[][]arr,char[] first,char[] second){
        char[]res=new char[arr[first.length-1][second.length-1]];
        int m=first.length-1;
        int n=second.length-1;
        int index=res.length-1;
        while(index>=0){
              if(m>0 &&arr[m][n]==arr[m-1][n]){
                m--;
            }
            else if(n>0&&arr[m][n]==arr[m][n-1]){
                n--;
            }else{
                res[index--]=first[m];
                m--;
                n--;
            }
        }
        return String.valueOf(res);

    }

相关文章:

  • Spring笔记02-bean的生命周期
  • 传统应用容器化迁移实践
  • 关于matlab和python谁快的问题
  • 【自学笔记】ELK基础知识点总览-持续更新
  • 如何通过数据可视化提升管理效率
  • JAVA-网络编程套接字Socket
  • mysql增、删、改和单表查询多表查询
  • 印刷电路板 (PCB) 的影响何时重要?在模拟环境中导航
  • 基于ssm的医院预约挂号系统
  • fircrawl本地部署
  • (UI自动化测试web端)第二篇:元素定位的方法_css定位之class选择器
  • 【AI】Orin NX+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功
  • LinkedIn数据抓取零风险指南:亮数据住宅代理实现企业级合规采集
  • 深入解析 RedissonMultiLock —— 分布式联锁的原理与实战
  • 我的第二个网站 - SpellCheck Game
  • java学习——函数式编程(1)
  • HTML5前端第六章节
  • 扭蛋机小程序开发,潮玩娱乐消费风口下的机遇
  • 多模态自动驾驶混合渲染HRMAD:将NeRF和3DGS进行感知验证和端到端AD测试
  • 关于微信小程序云开发轮播图渲染失败问题
  • 乌拉圭前总统何塞·穆希卡去世
  • 广东省中医院脾胃病科大科主任张北平病逝,年仅52岁
  • “75万买299元路由器”事件进展:重庆市纪委等三部门联合介入调查
  • 中国女足将于5月17日至6月2日赴美国集训并参加邀请赛
  • 中拉论坛部长级会议为何悬挂海地和圣卢西亚的国旗?外交部回应
  • 香港根据《维护国家安全条例》订立附属法例