题目
题目来源:力扣(LeetCode)
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False
思路分析
双指针
- 双指针遍历,⽤⼀个标记位记录是否编辑过。
- 当出现不相等的字符,就给它⼀次编辑的机会,后⾯再出现不相等就返回 false 。
- 编辑策略:如果两字符串⻓度相等,就⽤替换是最⼩编辑;不相等的话,⻓度⻓的字符串指针⾛⼀ 步就可以了,相当于字符串⻓的那个删除⼀个字符。
- 时间复杂度是 O(N) , 空间复杂度是O(1)。因为双指针是同时动的,⽽且两字符⻓度肯定是相等的或 者只差1才需要⽐较。
/*** @param {string} first* @param {string} second* @return {boolean}*/var oneEditAway = function (first, second) {// 因为只有一次编辑的机会,如果两个字符串长度相差大于1,直接返回falseif (Math.abs(first.length - second.length) > 1) return false;let i = 0;let j = 0;let edit = false;while (i < first.length && j < second.length) {// 两个字符串从前往后开始遍历,如果字符一样就继续比较下一个if (first.charAt(i) === second.charAt(j)) {i++;j++;} else {// 当出现不相等的字符,给予它⼀次编辑的机会,后⾯再出现不相等就返回 false 。if (!edit) {if (first.length === second.length) {// 如果两字符串⻓度相等,就⽤替换是最⼩编辑i++;j++;} else if (first.length < second.length) {// 不相等的话,⻓度⻓的字符串指针⾛⼀步就可以了,相当于字符串⻓的那个删除⼀个字符。j++;} else {i++;}edit = true;} else {return false;}}}return true;};
