当前位置: 面试刷题>> 两个字符串的删除操作 (经典算法题500道)


题目描述补充

题目:两个字符串的删除操作

给定两个字符串str1str2,你需要找到最少的删除操作次数,使得str1变为str2,或者str2变为str1。这里的删除操作指的是从字符串中删除一个字符。

示例

  • 输入:str1 = "sea", str2 = "eat"
  • 输出:2
  • 解释:第一种方式,在str1中删除's'并将'a'移动到末尾,得到"eat"。第二种方式,在str2中删除'e'和第一个't',得到"ea"。两种方式的删除操作次数都是2,所以输出为2。

PHP 代码示例

function minDistance($str1, $str2) {
    $m = strlen($str1);
    $n = strlen($str2);
    
    // 创建一个二维数组dp,dp[i][j]表示str1的前i个字符和str2的前j个字符之间的最小删除次数
    $dp = array_fill(0, $m + 1, array_fill(0, $n + 1, 0));
    
    // 初始化边界条件
    for ($i = 0; $i <= $m; $i++) {
        $dp[$i][0] = $i;
    }
    for ($j = 0; $j <= $n; $j++) {
        $dp[0][$j] = $j;
    }
    
    // 填充dp数组
    for ($i = 1; $i <= $m; $i++) {
        for ($j = 1; $j <= $n; $j++) {
            if ($str1[$i - 1] == $str2[$j - 1]) {
                $dp[$i][$j] = $dp[$i - 1][$j - 1];
            } else {
                $dp[$i][$j] = 1 + min($dp[$i - 1][$j], $dp[$i][$j - 1], $dp[$i - 1][$j - 1]);
            }
        }
    }
    
    return $dp[$m][$n];
}

// 测试
echo minDistance("sea", "eat"); // 输出 2

Python 代码示例

def minDistance(str1, str2):
    m, n = len(str1), len(str2)
    
    # 创建一个二维数组dp
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    
    # 初始化边界条件
    for i in range(m + 1):
        dp[i][0] = i
    for j in range(n + 1):
        dp[0][j] = j
    
    # 填充dp数组
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1]
            else:
                dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
    
    return dp[m][n]

# 测试
print(minDistance("sea", "eat"))  # 输出 2

JavaScript 代码示例

function minDistance(str1, str2) {
    const m = str1.length;
    const n = str2.length;
    
    // 创建一个二维数组dp
    const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
    
    // 初始化边界条件
    for (let i = 0; i <= m; i++) {
        dp[i][0] = i;
    }
    for (let j = 0; j <= n; j++) {
        dp[0][j] = j;
    }
    
    // 填充dp数组
    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];
            } else {
                dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
            }
        }
    }
    
    return dp[m][n];
}

// 测试
console.log(minDistance("sea", "eat")); // 输出 2

码小课网站中有更多关于算法和数据结构的相关内容分享给大家学习,欢迎访问并深入学习!

推荐面试题