题目:
HJ52 计算字符串的编辑距离
题解:
定义dp方程,dp[i][j] 表示字符串s1(1-i),到字符串s2(1-j)的编辑距离;
如果s1[i] == s2[j] 证明当前位置的字符相等,无需操作,即dp[i][j] = dp[i-1][j-1];
如果s1[i] != s2[j] 则需要进行修改,有三种修改方式:
1.删除:s1(1 - i-2) 编辑为 s2(1 - j-1) 在删除s1[i-1];
2.插入:s1(1 - i-1) 编辑为 s2(1 - i-2) 再插入s2[j-1];
3.修改:s1(1 - i-2) 编辑为 s2(1 - i-) 再将s1[i-1] 修改为 s2[i-1)
三种修改操作都需要增加一次编辑次数,然后取最小的一个。
dp 初始化:
dp[i][0] 表示s1(1-i)编辑为空,那么需要删除s1的所有字符,即dp[i][0]=i;
同理,dp[0][i]=i;
public int getDistance(String s1, String s2) {int n = s1.length();int m = s2.length();int[][] dp = new int[n + 1][m + 1];for (int i = 1; i < n + 1; i++) {dp[i][0] = i;}for (int i = 1; i < m + 1; i++) {dp[0][i] = i;}for (int i = 1; i < n + 1; i++) {for (int j = 1; j < m + 1; j++) {if (s1.charAt(i - 1) == s2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;}}}return dp[n][m];}
时间复杂度:O(n*m)