这里的dp含义和上一次不一样了,最长公共子序列的dp[i][j]表示str1的i位置和st2的j位置截止的最大长度,

而最长公共字串的dp[i][j]表示str1的i位置和str2的j位置作为最后一个元素所构成的最长公共字串,也就是str1的第i个位置必须作为公共子串的最后一个元素,在dp的过程中用index记录最大字串长度的最后一个元素下标

/*
  定义dp[i][j]表示字符串str1中第i个字符和str2种第j个字符为最后一个元素所构成的最长公共子串。
  如果要求dp[i][j],也就是str1的第i个字符和str2的第j个字符为最后一个元素所构成的最长公共子串
*/
function LCS( str1 ,  str2 ) {
  let maxLength = 0;//最大字串长度
  let index;//ii记录max最大时候的坐标,用于确定子串
  let dp = [];
  for(let i=0; i<str1.length; i++)
    dp.push([]);
  
  for(let i=0; i<str2.length; i++)
    dp[0][i] = (str1[0]==str2[i]) ? 1:0;
  
  for(let i=0; i<str1.length;i++)
    dp[i][0] = (str2[0]==str1[i]) ? 1:0;
  
  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;
        if(maxLength < dp[i][j]){
          maxLength = dp[i][j];
          index = i;
        }
      }else{
        dp[i][j] =0;
      }
    }
  }
  
  return str1.substring(index-maxLength+1,index+1)
}