题目描述
给定两个字符串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字符串
*/
//类似滑动窗口解法1
public static String LCS (String str1, String str2) {
// write code here
StringBuilder 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();
}
//动态规划 类似滑动窗口解法2
public 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++;第二个方法是看得别的大神的,解题思路值得我们思考!!!