【每日一题】【动态规划】2022年1月30日-NC127 最长公共子串
描述
给定两个字符串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); }
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/15857790.html