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


题目描述补充

题目:最长公共子串

给定两个字符串 s1s2,找出这两个字符串中最长的公共子串的长度。请注意,子串要求在原字符串中是连续的。

示例 1:

输入: s1 = "abcde", s2 = "ace" 
输出: 3
解释: 最长的公共子串是 "ace",所以其长度为 3。

示例 2:

输入: s1 = "abc", s2 = "abc"
输出: 3
解释: 最长的公共子串是 "abc",所以其长度为 3。

示例 3:

输入: s1 = "abc", s2 = "def"
输出: 0
解释: 两个字符串没有公共子串,所以返回 0。

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 示例代码

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 示例代码

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

码小课网站中有更多关于算法和数据结构的内容分享,大家可以去学习交流。

推荐面试题