题解 | #最长公共子串#
最长公共子串
https://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * longest common substring * @param str1 string字符串 the string * @param str2 string字符串 the string * @return string字符串 */ function LCS( str1 , str2 ) { // write code here //含义 str1[0到i]和str2[0到j]匹配,它们的最长公共子串长度为dp[i][j] //递推公式 if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1]+1 // else dp[i][j]=0 //初始化 dp[0][j]=str1[0]==str2[j]?1:0 // dp[i][0]=str1[i]==str2[0]?1:0 let dp = new Array(str1.length) for(let i=0;i<str1.length;i++){ dp[i]= new Array(str2.length) dp[i][0]=str1[i]==str2[0]?1:0 } for(let j =0;j<str2.length;j++){ dp[0][j]=str1[0]==str2[j]?1:0 } let max=0 let maxi=-1 for(let i =1;i<str1.length;i++){ for(let j =1;j<str2.length;j++){ if(str1[i]==str2[j]) dp[i][j]=dp[i-1][j-1]+1 else dp[i][j]=0 if(dp[i][j]>max){ max=dp[i][j] maxi=i } } } console.log(maxi,max) return str1.substr(maxi-max+1,max) } module.exports = { LCS : LCS };
因为要连续的子串,所以当str1[i]!=str2[j]就直接dp[i][j]=0
最长...子序列2因为不要求子串连续,所以当str1[i]!=str2[j]可以dp[i][j]可以延续之前已经匹配了的长度