題解 | #最長公共子串#
最長公共子串
http://fangfengwang8.cn/practice/f33f5adc55f444baa0e0ca87ad8a6aac
/** * 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規(guī)定的值即可 * * 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 };
因為要連續(xù)的子串,所以當str1[i]!=str2[j]就直接dp[i][j]=0
最長...子序列2因為不要求子串連續(xù),所以當str1[i]!=str2[j]可以dp[i][j]可以延續(xù)之前已經匹配了的長度