合并相邻字符的最小成本问题(字符替换与删除的进阶版)
字数 1469 2025-11-26 13:58:58

合并相邻字符的最小成本问题(字符替换与删除的进阶版)

题目描述:
给定一个字符串s和一个成本数组cost,其中cost[i]表示删除或替换字符s[i]的成本。我们可以执行两种操作:

  1. 删除任意位置的字符,成本为cost[i]
  2. 替换任意位置的字符为另一个字符,成本为cost[i]

目标是通过这些操作使得字符串变成回文串,求最小总成本。

解题过程:

  1. 问题分析:
  • 我们需要将字符串转换为回文串
  • 可以删除字符或替换字符
  • 每个操作都有对应的成本
  • 目标是找到成本最小的操作序列
  1. 定义状态:
    设dp[i][j]表示将子串s[i...j]变成回文串的最小成本。

  2. 状态转移方程:
    考虑子串s[i...j]的边界情况:

情况1:如果s[i] == s[j]

  • 当i == j时:dp[i][j] = 0(单个字符已经是回文)
  • 当i + 1 == j时:dp[i][j] = 0(两个相同字符已经是回文)
  • 否则:dp[i][j] = dp[i+1][j-1](两端字符相同,不需要操作)

情况2:如果s[i] != s[j]
我们有三种选择:
a) 删除s[i],成本为cost[i] + dp[i+1][j]
b) 删除s[j],成本为cost[j] + dp[i][j-1]
c) 替换s[i]或s[j]使得它们相等:

  • 替换s[i]为s[j],成本为cost[i] + dp[i+1][j-1]
  • 替换s[j]为s[i],成本为cost[j] + dp[i+1][j-1]

因此:dp[i][j] = min(
cost[i] + dp[i+1][j], // 删除s[i]
cost[j] + dp[i][j-1], // 删除s[j]
cost[i] + dp[i+1][j-1], // 替换s[i]为s[j]
cost[j] + dp[i+1][j-1] // 替换s[j]为s[i]
)

  1. 边界条件:
  • 当i > j时:dp[i][j] = 0(空字符串是回文)
  • 当i == j时:dp[i][j] = 0(单个字符是回文)
  1. 计算顺序:
    由于dp[i][j]依赖于dp[i+1][j]、dp[i][j-1]和dp[i+1][j-1],我们需要按子串长度从小到大计算。

  2. 示例演示:
    假设s = "abc", cost = [1,2,3]

计算dp[0][2](子串"abc"):

  • s[0]='a' ≠ s[2]='c'
  • 选项1:删除'a',成本=1 + dp[1][2] = 1 + min(删除'b',删除'c',...) = 1 + 2 = 3
  • 选项2:删除'c',成本=3 + dp[0][1] = 3 + min(删除'a',删除'b',...) = 3 + 1 = 4
  • 选项3:替换'a'为'c',成本=1 + dp[1][1] = 1 + 0 = 1
  • 选项4:替换'c'为'a',成本=3 + dp[1][1] = 3 + 0 = 3
    最小成本为1
  1. 算法实现:
    从长度为1的子串开始,逐步计算到整个字符串,最终dp[0][n-1]就是答案。

这个解法的时间复杂度是O(n²),空间复杂度是O(n²),可以优化到O(n)的空间复杂度。

合并相邻字符的最小成本问题(字符替换与删除的进阶版) 题目描述: 给定一个字符串s和一个成本数组cost,其中cost[ i]表示删除或替换字符s[ i ]的成本。我们可以执行两种操作: 删除任意位置的字符,成本为cost[ i ] 替换任意位置的字符为另一个字符,成本为cost[ i ] 目标是通过这些操作使得字符串变成回文串,求最小总成本。 解题过程: 问题分析: 我们需要将字符串转换为回文串 可以删除字符或替换字符 每个操作都有对应的成本 目标是找到成本最小的操作序列 定义状态: 设dp[ i][ j]表示将子串s[ i...j ]变成回文串的最小成本。 状态转移方程: 考虑子串s[ i...j ]的边界情况: 情况1:如果s[ i] == s[ j ] 当i == j时:dp[ i][ j ] = 0(单个字符已经是回文) 当i + 1 == j时:dp[ i][ j ] = 0(两个相同字符已经是回文) 否则:dp[ i][ j] = dp[ i+1][ j-1 ](两端字符相同,不需要操作) 情况2:如果s[ i] != s[ j ] 我们有三种选择: a) 删除s[ i],成本为cost[ i] + dp[ i+1][ j ] b) 删除s[ j],成本为cost[ j] + dp[ i][ j-1 ] c) 替换s[ i]或s[ j ]使得它们相等: 替换s[ i]为s[ j],成本为cost[ i] + dp[ i+1][ j-1 ] 替换s[ j]为s[ i],成本为cost[ j] + dp[ i+1][ j-1 ] 因此:dp[ i][ j ] = min( cost[ i] + dp[ i+1][ j], // 删除s[ i ] cost[ j] + dp[ i][ j-1], // 删除s[ j ] cost[ i] + dp[ i+1][ j-1], // 替换s[ i]为s[ j ] cost[ j] + dp[ i+1][ j-1] // 替换s[ j]为s[ i ] ) 边界条件: 当i > j时:dp[ i][ j ] = 0(空字符串是回文) 当i == j时:dp[ i][ j ] = 0(单个字符是回文) 计算顺序: 由于dp[ i][ j]依赖于dp[ i+1][ j]、dp[ i][ j-1]和dp[ i+1][ j-1 ],我们需要按子串长度从小到大计算。 示例演示: 假设s = "abc", cost = [ 1,2,3 ] 计算dp[ 0][ 2 ](子串"abc"): s[ 0]='a' ≠ s[ 2 ]='c' 选项1:删除'a',成本=1 + dp[ 1][ 2 ] = 1 + min(删除'b',删除'c',...) = 1 + 2 = 3 选项2:删除'c',成本=3 + dp[ 0][ 1 ] = 3 + min(删除'a',删除'b',...) = 3 + 1 = 4 选项3:替换'a'为'c',成本=1 + dp[ 1][ 1 ] = 1 + 0 = 1 选项4:替换'c'为'a',成本=3 + dp[ 1][ 1 ] = 3 + 0 = 3 最小成本为1 算法实现: 从长度为1的子串开始,逐步计算到整个字符串,最终dp[ 0][ n-1 ]就是答案。 这个解法的时间复杂度是O(n²),空间复杂度是O(n²),可以优化到O(n)的空间复杂度。