【每日一题】【动态规划】2022年1月30日-NC127 最长公共子串
2024-09-18 09:05:39
描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
方法1:dp数组存子串
import java.util.*; public class Solution {
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
public String LCS (String str1, String str2) {
int len1 = str1.length(), len2 = str2.length();
String[][] dp = new String[len1 + 1][len2 + 1]; //为何初始化为len+1,相当于从1-n
int max = 0;
String res = "";
for(int i = 0; i <= len1; i++) {
for(int j = 0; j <= len2; j++) {
if(i == 0 || j == 0) {
dp[i][j] = "";
} else if(str1.charAt(i - 1) == str2.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1] + str1.charAt(i - 1);
if(dp[i][j].length() > max) {
max = dp[i][j].length();
res = dp[i][j];
}
} else {
dp[i][j] = "";
}
}
}
return res;
}
}
类似题目:NC92 最长公共子序列(二)
方法2:dp数组存公共串长度
public static String LCS (String str1, String str2) {
int len1 = str1.length(), len2 = str2.length();
int[][] dp = new int[len1 + 1][len2 + 1];
int max = 0;
int index = 0;
for(int i = 0; i < len1; i++) {
for(int j = 0; j < len2; j++) {
if(str1.charAt(i) == str2.charAt(j)) {
dp[i + 1][j + 1] = dp[i][j] + 1;
}
if(dp[i + 1][j + 1] > max) {
max = dp[i + 1][j + 1];
index = i;
}
}
}
return str1.substring(index - max + 1, index + 1);
}
最新文章
- struts2类型转换
- vue.js之绑定class和style
- SAM4E单片机之旅——24、使用DSP库求向量数量积
- jsp前三章测试改错题
- 【C#】【Thread】Semaphore/SemaphoreSlim信号量
- tcp ip detatils
- Json.Net学习(1) 实现简单的序列化和反序列化
- CSS之照片翻转
- php错误消息捕获
- 自定义UINavigationItem的两种方法以及相应的隐藏方法
- 怎样设制 select 不可编辑 仅仅读
- 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)
- 动态样式语言—LESS
- JAVA异步加回调的例子
- 28 Python初学(事件驱动模型)
- CSS实现单行、多行文本超出部分显示省略号
- Linux 命令整理-ps
- Python小练习之判断一个日期是一年的第几天
- ruby 知识点随笔
- #WEB安全基础 : HTTP协议 | 0x7 学会使用wireshark分析数据包