当前位置: 面试刷题>> 最长公共子串 (经典算法题500道)


### 题目描述补充 题目:**最长公共子串** 给定两个字符串 `s1` 和 `s2`,找出这两个字符串中最长的公共子串的长度。请注意,子串要求在原字符串中是连续的。 **示例 1**: ``` 输入: s1 = "abcde", s2 = "ace" 输出: 3 解释: 最长的公共子串是 "ace",所以其长度为 3。 ``` **示例 2**: ``` 输入: s1 = "abc", s2 = "abc" 输出: 3 解释: 最长的公共子串是 "abc",所以其长度为 3。 ``` **示例 3**: ``` 输入: s1 = "abc", s2 = "def" 输出: 0 解释: 两个字符串没有公共子串,所以返回 0。 ``` ### PHP 示例代码 ```php function longestCommonSubstring($s1, $s2) { $m = strlen($s1); $n = strlen($s2); $maxLength = 0; // 创建一个二维数组来保存长度信息 $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, 0)); for ($i = 1; $i <= $m; $i++) { for ($j = 1; $j <= $n; $j++) { if ($s1[$i - 1] == $s2[$j - 1]) { $dp[$i][$j] = $dp[$i - 1][$j - 1] + 1; $maxLength = max($maxLength, $dp[$i][$j]); } } } return $maxLength; } // 测试示例 echo longestCommonSubstring("abcde", "ace"); // 输出: 3 ``` ### Python 示例代码 ```python def longestCommonSubstring(s1, s2): m, n = len(s1), len(s2) maxLength = 0 dp = [[0] * (n + 1) for _ in range(m + 1)] for i in range(1, m + 1): for j in range(1, n + 1): if s1[i - 1] == s2[j - 1]: dp[i][j] = dp[i - 1][j - 1] + 1 maxLength = max(maxLength, dp[i][j]) return maxLength # 测试示例 print(longestCommonSubstring("abcde", "ace")) # 输出: 3 ``` ### JavaScript 示例代码 ```javascript function longestCommonSubstring(s1, s2) { const m = s1.length; const n = s2.length; let maxLength = 0; const dp = Array.from({length: m + 1}, () => Array(n + 1).fill(0)); for (let i = 1; i <= m; i++) { for (let j = 1; j <= n; j++) { if (s1[i - 1] === s2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; maxLength = Math.max(maxLength, dp[i][j]); } } } return maxLength; } // 测试示例 console.log(longestCommonSubstring("abcde", "ace")); // 输出: 3 ``` 码小课网站中有更多关于算法和数据结构的内容分享,大家可以去学习交流。
推荐面试题