当前位置: 面试刷题>> 最长公共子串 (经典算法题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
```
码小课网站中有更多关于算法和数据结构的内容分享,大家可以去学习交流。