当前位置:网站首页>最长公共子串
最长公共子串
2022-08-02 03:33:00 【小艾菜菜菜】
算法——最长公共子串(一张图片看懂)
概述
给定str1与str2两个字符串,找出其中最长的公共子串。
思路
用str1和str2建立一个二维矩阵,很轻易的就能从中发现关系。矩阵的大小为:
int[][] dp = new int[str1.lenth()+1][str2.length()+1]
- 1
这是为了方便substring的操作而已。
下面给出图示方便理解:
代码
public class 最长公共子串 {
/** * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 * 将str1与str2组成一个二维矩阵,相同的地方标记为1,那么可以观察到对角线处相连的1就是一个连续的公共子串; * 为了搞到最大的值,则只需要将对角线的1不断地累加并保存即可,待矩阵构建完毕,我们就已经知道最大的子串长为多少, * 以及在哪个index结束。 */
public String LCS (String str1, String str2) {
//异常处理
if (str1 == null || str2 == null)
return str1 == null ? str2 : str1;
//动态规划
int len1 = str1.length(),
len2 = str2.length(),
max = 0,
index = 0;
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 0; i < len1; i++){
for (int j = 0; j < len2; j++){
//如果字符相等,则这个子串的长度取决于之前的子串长度 + 1
if (str1.charAt(i) == str2.charAt(j)){
dp[i + 1][j + 1] = dp[i][j] + 1;
}
if (max < dp[i + 1][j + 1]){
max = dp[i + 1][j + 1];
index = i + 1;
}
}
}
//截取字符串并返回
return max == 0 ? "-1" : str1.substring((index - max),(index));
}
}
边栏推荐
猜你喜欢

回溯法 & 分支限界 - 2

基础IO(上):文件管理和描述符

STM32F4 CAN 配置注意的细节问题

剑指Offer 35.复杂链表的复制

2019 - ICCV - 图像修复 Image Inpainting 论文导读《StructureFlow: Image Inpainting via Structure-aware ~~》

剑指Offer 34.二叉树中和为某一值的路径 dfs+回溯

Typora use

【LeetCode】Merge

VCA821可变增益放大器

Process (below): process control, termination, waiting, replacement
随机推荐
MQ-5 combustible gas sensor interface with Arduino
笔记本电脑充电问题
LT8918L LVDS转MIPI芯片技术支持资料
如何使用 PHP 实现网页交互
【plang 1.4.4】编写贪吃蛇脚本
Comparative analysis of OneNET Studio and IoT Studio
2020 - AAAI - 图像修复 Image Inpainting论文导读 -《Region Normalization for Image Inpainting》
Pylon CLI 低成本的本地环境管控工具应用实例
【MQ-3 Alcohol Detector and Arduino Detect Alcohol】
进程(番外):自定义shell命令行解释器
增量编译技术在Lightly中的实践
STM32F4 CAN 配置注意的细节问题
78XX 79XX多路输出电源
基础IO(上):文件管理和描述符
引擎开发日志:OpenGL资源多线程加载
最第k大的数的一般性问题
龙讯LT6911系列C/UXC/UXB/GXC/GXB芯片功能区别阐述
功率计,物联网,智能插座电路设计【毕业设计】
剑指Offer 36.二叉搜索树与双向链表 中序遍历
本地数据库 sqlite3 编译和使用