腾讯笔试题 -- 动态规划之两个字符串的最长公共子序列

三、题目说明

=========================================================================

给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。

比如字符串1:ABCFGR;字符串2:ABFR2

则这两个字符串的最长公共子序列长度为4,最长公共子序列是:ABFR

四、思路分析

=========================================================================

下图为子序列

在这里插入图片描述

下图是两个序列中最长的子序列

在这里插入图片描述

思路分析

首先我们假设给定的字符串如下

String str1 = “abcefg”;

String str2 = “acdg”;

我们提取出每个序列的最后一位进比较是否相等,如果相等,那就拿出来,每次计算出来后再次累加上相等的序列

String str1 = “abcefg”;

String str2 = “acdg”;

//提取出来后如下

“g”;

“g”;

然后我们提取出除了最后一位后的所有字符,进行依次比较,递归实现比较

String str1 = “abcefg”;

String str2 = “acdg”;

“abce”

“acd”

//最后一位字符比较,如果不同,那么先去掉,直接比较下一个,依次比较,如果相同,那就累加之前存的相同字符,最后执行完毕后进行return结果

五、递归实现

=========================================================================

思路我们大概都知道了,就是一个一个的遍历比较是否相同,相同就累加,不同就去除,进行下一次比较!

⌚核心源码


现在上代码

package com.wanshi.test;

import org.junit.Test;

public class Test3 {

@Test

public void test() {

String str1 = “新增本土新冠肺炎确诊病例322例和无症状感染者19660例”;

String str2 = “上海新增本土新冠肺炎确诊病例322例,无症状感染者19660例”;

long start = System.currentTimeMillis();

String res = lcs(str1, str2);

long end = System.currentTimeMillis();

System.out.println(“res:”+res);

System.out.println(“执行时间:” + (end - start));

}

/**

  • 递归计算两个序列的最长公共子序列并返回结果

  • @param str1 第一个序列

  • @param str2 第二个序列

  • @return res

*/

private String lcs(String str1, String str2) {

//最后的结果存储在此局部变量内

String lcsRes = “”;

//如果str1包含str2,直接返回str2即可

if (str1.contains(str2)) {

return str2;

}

//如果str2包含str1,直接返回str1即可

if (str2.contains(str1)) {

return str1;

}

//边界判断,如果没有数据直接返回结果即可

if (str1.length() <= 0 || str2.length() <= 0) {

return lcsRes;

}

//截取最后一位字符

String str1Last = str1.substring(str1.length()-1);

String str2Last = str2.substring(str2.length()-1);

//截取除了最后一位字符后剩余的字符

String str1Content = str1.substring(0, str1.length()-1);

String str2Content = str2.substring(0, str2.length()-1);

//判断第一位字符是否相同,忽略大小写判断

if (str1Last.equalsIgnoreCase(str2Last)) {

lcsRes = lcs(str1Content, str2Content) + str1Last;

} else {

//比较剩余的内容并存储

String strRes1 = lcs(str1Content, str2);

String strRes2 = lcs(str2Content, str1);

if (strRes1.length() > strRes2.length()) {

lcsRes = strRes1;

} else {

lcsRes = strRes2;

}

}

return lcsRes;

}

}

♻️执行效果


在这里插入图片描述

⚠️递归实现的缺点


  • 大大的降低了系统的性能,降低了可用性

  • 执行时间太长,健壮性不好

使用递归实现,是一层一层往里走,执行,所以执行过程比较多,就好比俄罗斯套娃,一层套一层,最后一层一层返回,执行效率极低!

六、递归+动态规划实现

==============================================================================

优化代码,采用动态规划的方式解决!

⏳核心源码


package com.wanshi.test;

import org.junit.Test;

import java.util.HashMap;

import java.util.Map;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

一线互联网P7面试集锦+各种大厂面试集锦

学习笔记以及面试真题解析

部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-LtUIKrM5-1710763074520)]

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

[外链图片转存中…(img-qUli2yKd-1710763074520)]

一线互联网P7面试集锦+各种大厂面试集锦

[外链图片转存中…(img-Q0fuDu5J-1710763074520)]

学习笔记以及面试真题解析

[外链图片转存中…(img-cxCVGBV6-1710763074521)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 14
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值