开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
更多、更体系化的内容请持续关注 《菜鸟程序员成长计划》之数据结构与算法 专栏,您的 关注、点赞、收藏 都将是小编持续创作的动力!
题目
字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = "pale"
second = "ple"
输出: True
示例 2:
输入:
first = "pales"
second = "pal"
输出: False
解题
方法一
一、方法描述
- 逐个对比;
- 首次发现不等,则按如下处理并将boolean机会置false;
- 若前者较长,那么给后者加1长度;
- 若后者较长,那么给前者加1长度;
- 长度相等,无处理;
- 再次遇到不等直接返回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中各自对应的位置差值,必须小于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
参考:本篇内容参考自开源社区,感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情