最长公共子串(两种解法)
最长公共子串
题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。
示例1
输入
"1AB2345CD","12345EF"
返回值
"2345"
备注:
1 ≤∣str1∣,∣str2∣≤5000
代码如下:
import java.util.*;public class Solution {/*** longest common substring* @param str1 string字符串 the string* @param str2 string字符串 the string* @return string字符串*///类似滑动窗口解法1public static String LCS (String str1, String str2) {// write code hereStringBuilder sb = new StringBuilder();int end = 1;int start = 0;while (end < str1.length() + 1) {if (str2.contains(str1.substring(start,end))) {if (sb.length() < end-start) {sb.delete(0,sb.length());sb.append(str1,start,end);}}else {start++;}end++;}if (sb.length() == 0) {return "-1";}return sb.toString();}//动态规划 类似滑动窗口解法2public static String LCS2(String str1, String str2) {if (str1 == null || str2 == null) return "-1";int n1 = str1.length(), n2 = str2.length();if (n1 == 0 || n2 == 0) return "-1";int[][] dp = new int[n1 + 1][n2 + 1];int maxLen = 0, x = 0;for (int i = 1; i <= n1; i++) {char ch1 = str1.charAt(i - 1);for (int j = 1; j <= n2; j++) {char ch2 = str2.charAt(j - 1);if (ch1 == ch2) {dp[i][j] = dp[i - 1][j - 1] + 1;if (dp[i][j] > maxLen) {maxLen = dp[i][j];x = i;}}}}return maxLen == 0 ? "-1" : str1.substring(x - maxLen, x);}
}
解题思路:
上面的代码类似滑动窗口,很好理解,就是头尾设置一个值,然后判断条件让start++和end++;第二个方法是看得别的大神的,解题思路值得我们思考!!!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
