WUSTOJ 1889: 编辑距离(Java)

108 篇文章 0 订阅
80 篇文章 18 订阅
转自:?LintCode:119.编辑距离(动态规划) - HxxxxxxU的博客 - CSDN博客
题目链接:?1889: 编辑距离
分析?
名词解释
A				// 字符串A
B				// 字符串B
minOperateNum	// 最少操作次数
t1, t2, t3		// 临时变量
  • AB长度都为0,显然minOperateNum[0][0] = 0
  • A长度为0B长度为1,显然只需要在A末尾插入一个字符(即B末尾的字符),minOperateNum[0][1] = 1
  • A长度为1B长度为0,显然只需要将A末尾字符删除即可。minOperateNum[1][0] = 1
  • A = "c"B = "c",去掉末尾相同字符,则AB长度都为0,故minOperateNum[1][1] = minOperateNum[0][0]
  • A = "c"B = "d",将c替换成d使得末尾字符相同,去掉末尾相同字符,那么AB长度为0,故minOperateNum[1][1] = minOperateNum[0][0] + 1
  • A长度为0B = "cd",在A末尾插入cd使得AB末尾字符相同,去掉相同字符,AB长度为0,故minOperateNum[0][2] = 2
  • A = "d"B = "cd",末尾字符相同,去掉,A长度为0B = "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\B01(g)2(gf)3(gfd)4(gfdg)5(gfdgw)
0012345
1(s)112345
2(sf)221234
3(sfd)332123
4(sfdq)443223
5(sfdqx)554333
6(sfdqxb)665444
7(sfdqxbw)776554
代码?
/**
 * 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();
	}
}

版权声明:

  1. 转载请于首页注明链接形式的WUSTOJ 1889: 编辑距离(Java)——wowpH
  2. 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
  3. 如果有疑问欢迎评论区留言,尽量解答;
  4. 如果有错误,还望大侠评论区指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值