求解两个字符串的最大公共子串可以使用动态规划算法。 下面是用 JavaScript 实现的代码: ```javascript function longestCommonSubstring(str1, str2) { const m = str1.length; const n = str2.length; // 创建一个二维数组用于存储子问题的解 const dp = Array(m + 1).fill(0).map(() => Array(n + 1).fill(0)); let maxLength = 0; // 最长公共子串的长度 let endIndex = 0; // 最长公共子串在 str1 中的结束索引 for (let i = 1; i <= m; i++) { for (let j = 1; j <= n; j++) { if (str1[i - 1] === str2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; // 当前字符相等,则公共子串长度加一 if (dp[i][j] > maxLength) { maxLength = dp[i][j]; endIndex = i - 1; // 更新最长公共子串的结束索引 } } else { dp[i][j] = 0; // 当前字符不相等,则公共子串长度为零 } } } // 根据最长公共子串的结束索引和长度,提取出最长公共子串 const longestSubstr = str1.substr(endIndex - maxLength + 1, maxLength); return longestSubstr; } ``` 在代码中,我们使用一个二维数组 `dp` 来存储子问题的解,其中 `dp[i][j]` 表示以字符串 `str1` 的第 `i` 个字符和字符串 `str2` 的第 `j` 个字符为结尾的最长公共子串的长度。 通过两层循环遍历 `str1` 和 `str2` 的所有字符,如果当前字符相等,则更新 `dp[i][j] = dp[i-1][j-1] + 1`;否则,置 `dp[i][j] = 0`。 在计算过程中,我们同时记录最长公共子串的长度 `maxLength` 和结束索引 `endIndex`,以便后续提取出最长公共子串。 最后,根据 `endIndex` 和 `maxLength` 提取出最长公共子串,并返回它。 注意,该算法的时间复杂度为 $O(m \times n)$,其中 $m$ 和 $n$ 分别是两个字符串的长度。