WUSTOJ 1889: 编辑距离(Java)
转自:🔗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;
- 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。

浙公网安备 33010602011771号