「 数据结构与算法 」一次编辑

文章介绍了两种方法解决编程问题,即判断两个字符串是否只需要一次或零次编辑操作(插入、删除或替换字符)就能相互转换。方法一是通过逐个对比字符并处理不等的情况,方法二是分别从前向后和从后向前对比并记录位置。两种方法均在1毫秒内完成,且内存消耗较低。

更多、更体系化的内容请持续关注 《菜鸟程序员成长计划》之数据结构与算法 专栏,您的 关注、点赞、收藏 都将是小编持续创作的动力!


题目

字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

示例 1:

输入: 
first = "pale"
second = "ple"
输出: True

示例 2:

输入: 
first = "pales"
second = "pal"
输出: False

解题

方法一

一、方法描述
  1. 逐个对比;
  2. 首次发现不等,则按如下处理并将boolean机会置false;
    • 若前者较长,那么给后者加1长度;
    • 若后者较长,那么给前者加1长度;
    • 长度相等,无处理;
  3. 再次遇到不等直接返回false,或无不等返回true;
class Solution {
    public boolean oneEditAway(String first, String second) {
        if (first == null && second == null) {
			return true;
		}
		int len1 = first.length();
		int len2 = second.length();
		int t = len1 - len2;
		if (t > 1 || t < -1) {
			return false;
		}
		int i = 0, j = 0;
		boolean onceChance = true;
		while (i < len1 && j < len2) {
			if (first.charAt(i) != second.charAt(j)) {
				if (onceChance) {
					if (t == 1) {
						j--;
					} else if (t == -1) {
						i--;
					}
					onceChance = !onceChance;
				} else {
					return onceChance;
				}
			}
			i++;
			j++;
		}
		return true;
    }
}
二、执行结果

执行结果: 通过

执行用时:1 ms

内存消耗:41 MB


方式二

一、方法描述
  1. 从头到尾对比并记录位置;
  2. 从尾到头对比并记录位置;
  3. 校验步骤1和2中各自对应的位置差值,必须小于2;
class Solution {
    public boolean oneEditAway(String first, String second) {
        if (first == null && second == null) {
			return true;
		}
		int len1 = first.length();
		int len2 = second.length();
		int t = len1 - len2;
		if (t > 1 || t < -1) {
			return false;
		}
		int k = 0;
		while (k < len1 && k < len2 && first.charAt(k) == second.charAt(k)) {
			k++;
		}
		len1--;
		len2--;
		while (len1 >= k && len2 >= k && first.charAt(len1) == second.charAt(len2)) {
			len1--;
			len2--;
		}
		return (len1 - k) < 1 && (len2 - k) < 1;
    }
}
二、执行结果

执行结果: 通过

执行用时:1 ms

内存消耗:41.3 MB

参考:本篇内容参考自开源社区,感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白吃饱了吗

请博主喝杯咖啡,有力继续码字!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值