题解 | #最长公共子串#
最长公共子串
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]可以延续之前已经匹配了的长度
查看18道真题和解析
vivo公司福利 364人发布