Skip to content

Commit 66ddc61

Browse files
committed
add leetcode: 72
1 parent d2f230b commit 66ddc61

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package leetCode.subject.number51_100;
2+
3+
/**
4+
* @author : CodeWater
5+
* @create :2022-08-06-18:14
6+
* @Function Description :72. 编辑距离
7+
*/
8+
public class _72EditDistance {
9+
class Solution {
10+
/**DP:
11+
首先,先插入再删除一个字符肯定不是最优解。因为他需要两次。
12+
其次,操作顺序不影响结果,比如先删一个再替换和先替换在删除,这两个顺序不一样不影响结果。
13+
状态表示:f[i][j]:将a[1-i]变成b[1-j]的所有按顺序操作方案数。
14+
属性:最少值
15+
状态集合划分:对于当前f[i][j]可以划分成6个子集(一个字符串有三种操作,两个字符串就有6
16+
种),在子集中取min即可
17+
1.删除a的最后一个字符a[i]。f(i-1 , j) + 1
18+
2.在a的最后一位加一个字符。f(i , j - 1 ) + 1
19+
3.修改a的最后一个字符,f(i - 1 , j -1 ) + 1/0
20+
4.删除b[j], f( i , j - 1) + 1
21+
5.在b[j]后加,f( i - 1 , j ) + 1
22+
6.修改b[j], f(i - 1 , j - 1 ) + 1/0
23+
综上,只有三种情况:f(i - 1, j) , f(i , j -1 ) , f( i -1 , j -1)
24+
*/
25+
public int minDistance(String a, String b) {
26+
int n = a.length() , m = b.length();
27+
// 为了遍历方便,把字符串前补空格,下标从1开始遍历
28+
a = " " + a ;
29+
b = " " + b;
30+
31+
int[][] f = new int[n + 1][m + 1];
32+
for( int i = 0 ; i <= n ; i++ ) f[i][0] = i;
33+
for( int j = 0 ; j <= m ; j++ ) f[0][j] = j;
34+
35+
for( int i = 1 ; i <= n ; i++ ){
36+
for( int j = 1 ; j <= m ; j++ ){
37+
// 删除,添加
38+
f[i][j] = Math.min( f[i - 1][j] , f[i][j - 1] )+ 1;
39+
// 修改:ij位置处不相等时要加1,相等时不用加
40+
f[i][j] = Math.min( f[i][j] , f[i - 1][j - 1] + (a.charAt(i) != b.charAt(j) ? 1 : 0 ) );
41+
42+
}
43+
}
44+
45+
return f[n][m];
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)