描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
示例1
输入:
“1AB2345CD”,”12345EF”
返回值:
“2345”
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 maxLength = 0;//记录最长公共子串最后一个元素在字符串str1中的位置int maxLastIndex = 0;int[][] dp = new int[str1.length() + 1][str2.length() + 1];for(int i=0; i<str1.length(); i++){for(int j = 0; j < str2.length(); j++){//递推公式,两个字符相等的情况if(str1.charAt(i) == str2.charAt(j)){dp[i+1][j+1] = dp[i][j] + 1;//如果遇到了更长的子串,要更新,记录最长子串的长度,//以及最长子串最后一个元素的位置if(dp[i+1][j+1] > maxLength){maxLength = dp[i+1][j+1];maxLastIndex = i;}} else{//递推公式,两个字符不相等的情况dp[i+1][j+1] = 0;}}}//最字符串进行截取,substring(a,b)中a和b分别表示截取的开始和结束位置return str1.substring(maxLastIndex-maxLength+1,maxLastIndex +1);}}
