=========================================================================
给定两个字符串,求解这两个字符串的最长公共子序列(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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识
一线互联网P7面试集锦+各种大厂面试集锦
学习笔记以及面试真题解析
部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-LtUIKrM5-1710763074520)]
线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识
[外链图片转存中…(img-qUli2yKd-1710763074520)]
一线互联网P7面试集锦+各种大厂面试集锦
[外链图片转存中…(img-Q0fuDu5J-1710763074520)]
学习笔记以及面试真题解析
[外链图片转存中…(img-cxCVGBV6-1710763074521)]