转自:?LintCode:119.编辑距离(动态规划) - HxxxxxxU的博客 - CSDN博客
题目链接:?1889: 编辑距离
分析?
名词解释
A // 字符串A
B // 字符串B
minOperateNum // 最少操作次数
t1, t2, t3 // 临时变量
A
和B
长度都为0
,显然minOperateNum[0][0] = 0
。A
长度为0
,B
长度为1
,显然只需要在A
末尾插入一个字符(即B
末尾的字符),minOperateNum[0][1] = 1
。A
长度为1
,B
长度为0
,显然只需要将A
末尾字符删除即可。minOperateNum[1][0] = 1
。A = "c"
,B = "c"
,去掉末尾相同字符,则A
和B
长度都为0
,故minOperateNum[1][1] = minOperateNum[0][0]
。A = "c"
,B = "d"
,将c
替换成d
使得末尾字符相同,去掉末尾相同字符,那么A
和B
长度为0
,故minOperateNum[1][1] = minOperateNum[0][0] + 1
。A
长度为0
,B = "cd"
,在A
末尾插入c
和d
使得A
和B
末尾字符相同,去掉相同字符,A
和B
长度为0
,故minOperateNum[0][2] = 2
。A = "d"
,B = "cd"
,末尾字符相同,去掉,A
长度为0
,B = "c"
,故minOperateNum[1][2] = minOperate[0][1] = 1
。A = "c"
,B = "cd"
,末尾字符不同- 在
A
末尾插入d
使得A = "cd"
和B = "cd"
相同,故t1 = minOperateNum[1][1] = minOperateNum[0][0] = 0
。 - 将
A
末尾的字符c
删除使得A
长度为0
,故t2 = minOperateNum[0][2] = 2
。 - 将
A
末尾的c
替换成B
末尾的字符d
,那么A = "d"
,末尾字符相同去掉,故t3 = minOperateNum[0][1] = 1
。 - 上述三种操次数最少为
t1 = 0
加上本身的一次操作,故minOperateNum[1][2] = t1 + 1 = 1
。
- 在
输入数据如下:
sfdqxbw
gfdgw
对应的最少操作次数对照表如?
A\B | 0 | 1(g) | 2(gf) | 3(gfd) | 4(gfdg) | 5(gfdgw) |
---|---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 | 5 |
1(s) | 1 | 1 | 2 | 3 | 4 | 5 |
2(sf) | 2 | 2 | 1 | 2 | 3 | 4 |
3(sfd) | 3 | 3 | 2 | 1 | 2 | 3 |
4(sfdq) | 4 | 4 | 3 | 2 | 2 | 3 |
5(sfdqx) | 5 | 5 | 4 | 3 | 3 | 3 |
6(sfdqxb) | 6 | 6 | 5 | 4 | 4 | 4 |
7(sfdqxbw) | 7 | 7 | 6 | 5 | 5 | 4 |
代码?
/**
* Time 435ms
* @author wowpH
* @version 2.2
* @date 2019年5月24日下午11:52:41
* Environment: Windows 10
* IDE Version: Eclipse 2019-3
* JDK Version: JDK1.8.0_112
*/
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
private static int minOperate(String a, String b) {
// 最少操作的次数
int[][] minOperateNum = new int[a.length() + 1][b.length() + 1];
// 字符串B长度为0时,字符串A只需要删除自身的全部字符即可
for (int i = 1; i <= a.length(); i++) {
minOperateNum[i][0] = i;
}
// 字符串A长度为0时,字符串A只需要插入字符串B的全部字符即可
for (int i = 1; i <= b.length(); i++) {
minOperateNum[0][i] = i;
}
int t1, t2, t3;// 临时变量
for (int i = 1; i <= a.length(); i++) {
for (int j = 1; j <= b.length(); j++) {
if (a.charAt(i - 1) == b.charAt(j - 1)) {// 末尾字符相同
minOperateNum[i][j] = minOperateNum[i - 1][j - 1];
} else {// 末尾字符不同
// 在字符串A末尾插入一个【字符串B末尾的】字符使得AB末尾字符相同
t1 = minOperateNum[i][j - 1];
// 将字符串A末尾的字符删除
t2 = minOperateNum[i - 1][j];
// 将字符串A末尾的字符替换成字符串B末尾的字符使得AB末尾字符相同
t3 = minOperateNum[i - 1][j - 1];
// 取种操作中次数最少的一种操作加1即为当前的最少操作次数
minOperateNum[i][j] = Math.min(t3, Math.min(t1, t2)) + 1;
}
}
}
// 返回当前最少操作次数,即为结果
return minOperateNum[a.length()][b.length()];
}
public static void main(String[] args) {
String a, b;
Scanner sc = new Scanner(new InputStreamReader(System.in));
while (sc.hasNext()) {
a = sc.next();
b = sc.next();
System.out.println(minOperate(a, b));
}
sc.close();
}
}
版权声明:
- 转载请于首页注明链接形式的WUSTOJ 1889: 编辑距离(Java)——wowpH;
- 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。