设A和B是两个字符串,求将字符串A转换为字符串B的最少操作次数。字符操作共有如下三种:
(1)删除一个字符。
(2)插入一个字符。
(3)将一个字符改为另一个字符。
如A = “kitten”、 B = “sitting“,求编辑距离。
Java答案:
import java.util.Scanner; public class Main { public static void main(String[]args){ Scanner v = new Scanner(System.in); String [] a = v.next().split(""); String [] b = v.next().split(""); int [][] dp = new int[b.length + 1][a.length + 1]; for (int i = 0; i <= a.length; i++) { dp[0][i] = i; } for (int i = 0; i <= b.length; i++) { dp[i][0] = i; } for (int i = 1; i <= b.length; i++) { for (int j = 1; j <= a.length; j++) { if (b[i - 1].equals(a[j - 1])){ dp[i][j] = dp[i - 1][j - 1]; }else { dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i - 1][j - 1] + 1); dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1); } } } System.out.println(dp[b.length][a.length]); } }
解析:
-
输入处理:
- 使用
Scanner
从标准输入读取两个字符串,并分别用split("")
方法将其拆分成字符数组。
- 使用
-
初始化DP表:
dp[i][j]
表示将字符串b
的前i
个字符转换为字符串a
的前j
个字符所需的最小操作次数。dp[0][i] = i
表示将空字符串转换为a
的前i
个字符所需的操作次数,即插入i
次。dp[i][0] = i
表示将b
的前i
个字符转换为空字符串所需的操作次数,即删除i
次。
-
填充DP表:
- 如果当前字符相同 (
b[i - 1].equals(a[j - 1])
),则不需要额外操作,继承之前的状态dp[i - 1][j - 1]
。 - 如果不同,则考虑三种操作:
- 插入一个字符:
dp[i][j - 1] + 1
- 删除一个字符:
dp[i - 1][j] + 1
- 替换一个字符:
dp[i - 1][j - 1] + 1
- 插入一个字符:
- 取上述三种操作的最小值作为当前状态的值。
- 如果当前字符相同 (
-
输出结果:
- 最终结果保存在
dp[b.length][a.length]
中,表示将整个字符串b
转换为整个字符串a
所需的最小操作次数。
- 最终结果保存在