当前位置:网站首页>leetCode-面试题 01.05: 一次编辑
leetCode-面试题 01.05: 一次编辑
2022-06-24 09:43:00 【文丑颜不良啊】
题目描述
字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例
示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False
解题过程
思路及步骤
(1)记 m 为 first 字符串的长度, n 为 second 字符串的长度;
(2)当 |m - n| > 1, 即两个字符串的长度相差大于等于 2 时, 直接 return false, 因为无法通过一次或更少的编辑使得两个串相等;
(3)为了处理方便, 我们需保证 first 字符串为较短的一个, 所以当 second 的长度大于 first 时, 将两字符串交换;
(4)使用 i 遍历 first 字符串, j 遍历 second 字符串, count 用来记录操作次数;
(5)如果 i 和 j 对应的字符相等, 则同时右移;
(6)如果 i 和 j 不相等且 m == n, 这种情况可通过替换操作使两字符相等, 从而保证两字符串相等, 所以 i 和 j 同时右移, 同时 count 自增 1;
(7)如果 i 和 j 不相等且 m ≠ n, 因为我们保证了 first 是较短的一个串, 所以此时 m < n, 这种情况可通过添加或删除操作使两字符相等, 从而保证两字符串相等, 此时, i 不变, j 右移, 同时 count 自增 1;
(8)遍历进行的条件是 i < m && j < n && count <= 1, 循环结束后将 count 是否小于等于 1 的结果返回即可
代码展示
public class OneEditAway {
/** * 记 m 为 first 字符串的长度, n 为 second 字符串的长度 * 当 |m - n| > 1, 即两个字符串的长度相差大于等于 2 时, 直接 return false, 因为无法通过一次或更少的编辑使得两个串相等 * 为了处理方便, 我们需保证 first 字符串为较短的一个, 所以当 second 的长度大于 first 时, 将两字符串交换 * 使用 i 遍历 first 字符串, j 遍历 second 字符串, count 用来记录操作次数 * 如果 i 和 j 对应的字符相等, 则同时右移 * 如果 i 和 j 不相等且 m == n, 这种情况可通过替换操作使两字符相等, 从而保证两字符串相等, 所以 i 和 j 同时右移, 同时 count 自增 1 * 如果 i 和 j 不相等且 m ≠ n, 因为我们保证了 first 是较短的一个串, 所以此时 m < n, 这种情况可通过添加或删除操作使两字符相等, 从而保证两字符串相等, 此时, i 不变, j 右移, 同时 count 自增 1 * 遍历进行的条件是 i < m && j < n && count <= 1, 循环结束后将 count 是否小于等于 1 的结果返回即可 **/
public boolean oneEditAway(String first, String second) {
if (first.length() == 0 || second.length() == 0) {
return true;
}
int m = first.length();
int n = second.length();
if (Math.abs(m - n) > 1) {
return false;
}
if (m > n) {
// 保证 first 是较短的一个
return oneEditAway(second, first);
}
// i 控制 first 的遍历
int i = 0;
// j 控制 second 的遍历
int j = 0;
// count 记录操作次数
int count = 0;
while (i < m && j < n && count <= 1) {
char firstChar = first.charAt(i);
char secondChar = second.charAt(j);
if (firstChar == secondChar) {
// 若两个字符相等, 则同时右移
i++;
j++;
} else {
// 若两个字符不相等
if (m == n) {
// 只能是替换操作
count++;
i++;
j++;
} else {
// m ≠ n, 因为已经确保了 first 为较短的一个串, 所以此时 m < n
// 插入或删除操作
j++;
count++;
}
}
}
return count <= 1;
}
public static void main(String[] args) {
System.out.println(new OneEditAway().oneEditAway("palet", "palt"));
}
}
边栏推荐
- Operator details
- SQL sever基本数据类型详解
- 二叉树第一部分
- 十大证券公司哪个佣金最低,最安全可靠?有知道的吗
- 解决Deprecated: Methods with the same name as their class will not be constructors in报错方案
- Open Oracle server under Linux to allow remote connection
- uniapp实现点击拨打电话功能
- dedecms模板文件讲解以及首页标签替换
- 请问有国内靠谱低手续费的期货开户渠道吗?网上开户安全吗?
- 学习使用KindEditor富文本编辑器,点击上传图片遮罩太大或白屏解决方案
猜你喜欢

uniapp 开发微信公众号,下拉框默认选中列表第一个

Three ways to use applicationcontextinitializer

Analysis of 43 cases of MATLAB neural network: Chapter 32 time series prediction of wavelet neural network - short-term traffic flow prediction

indexedDB本地存储,首页优化

整理接口性能优化技巧,干掉慢代码

p5.js实现的炫酷交互式动画js特效

CVPR 2022 oral | NVIDIA proposes an efficient visual transformer network a-vit with adaptive token. The calculation of unimportant tokens can be stopped in advance

Development of anti fleeing marketing software for health products

SQL Sever中的窗口函数row_number()rank()dense_rank()

SQL Sever关于like操作符(包括字段数据自动填充空格问题)
随机推荐
Can the long-term financial products you buy be shortened?
port 22: Connection refused
SQL sever基本数据类型详解
Canvas draw picture
dedecms模板文件讲解以及首页标签替换
Go language development environment setup +goland configuration under the latest Windows
Arbre binaire partie 1
被困英西中学的师生安全和食物有保障
Symbol.iterator 迭代器
上升的气泡canvas破碎动画js特效
物联网?快来看 Arduino 上云啦
415-二叉树(144. 二叉树的前序遍历、145. 二叉树的后序遍历、94. 二叉树的中序遍历)
Mise en œuvre du rendu de liste et du rendu conditionnel pour l'apprentissage des applets Wechat.
PHP file lock
How do novices choose the grade of investment and financial products?
2021-08-17
web网站开发,图片懒加载
js单例模式
What are the characteristics of EDI local deployment and cloud hosting solutions?
十大证券公司哪个佣金最低,最安全可靠?有知道的吗