一、题目
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
二、实现(动态规划)
以"helloworld"和“loop”为例
当s1[i] != s2[j]时,dp[i][j]就直接等于0了,因为子串必须连续,且dp[i][j] 表示的是以s1[i],s2[j]截尾的公共子串的长度
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) {
//1.如果是空串,则不匹配
if(str1.length()==0 || str2.length()==0){
return "-1";
}
//2.将字符串转化为数组
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
//3. 定义相关变量
int end = -1; //存储最长公共子串的结尾下标
int max = 0; //最长公共子串的长度
//4. 定义动态规划数组
int[][] dp = new int[str1.length()][str2.length()];
//5. 获取动态规划数组
for(int i=0;i<str1.length();i++){
for(int j=0;j<str2.length();j++){
//5.1 处理第一行第一列(相等则为1)
if(i==0 || j==0){
dp[i][j] = s1[i]==s2[j] ? 1: 0;
}else{
// 5.2 出现相等的字符
if(s1[i]==s2[j]){//上个位置最长公共子串长度+1
dp[i][j] = dp[i-1][j-1]+1;
}
}
// 5.3 获取当前最长公共子串长度
if(dp[i][j]>max){
max = dp[i][j];
end = i;
}
}
}//for
return end==-1?"-1":str1.substring(end-max+1,end+1);
}
}