leetcode 链接:一次编辑
题目
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次 (或者零次) 编辑。
示例:
输入: first = "pale", second = "ple"
输出: true
输入: first = "pales", second = "pal"
输出: false
输入: first = "pale", second = "bale"
输出: true
输入: first = "pale", second = "bake"
输出: false
解答 & 代码
比较两个字符串 fisrt
和 second
的长度,分为 4 种情况:
- 长度相同:若为一次/零次编辑,则只能是替换了一个字符或者没有变化
- 逐个比较两个字符串的字符,若有超过一个字符不同,则返回 false,否则返回 true
first
的长度比second
长一个字符:若为一次编辑,则只能是first
删除了一个字符- 先逐个比较两个字符串的字符,找出第一次不同的位置
first
跳过该位置(second
不跳),从下一位置开始继续与second
的字符比较,若又出现不同,则返回 false;若都相同,则返回 true
first
的长度比second
短一个字符:若为一次编辑,则只能是first
插入了一个字符- 先逐个比较两个字符串的字符,找出第一次不同的位置
second
跳过该位置(first
不跳),从下一位置开始继续与first
的字符比较,若又出现不同,则返回 false;若都相同,则返回 true
else:返回 false
class Solution { public: bool oneEditAway(string first, string second) { if(first.size() == second.size()) { int diff_cnt = 0; for(int i = 0; i < first.size(); ++i) { if(first[i] != second[i]) ++diff_cnt; if(diff_cnt > 1) return false; } return true; } else if(first.size() - second.size() == 1) { int i = 0; for(; i < second.size() && first[i] == second[i]; ++i) { } for(; i < second.size(); ++i) { if(first[i + 1] != second[i]) return false; } return true; } else if(second.size() - first.size() == 1) { int i = 0; for(; i < first.size() && first[i] == second[i]; ++i) { } for(; i < first.size(); ++i) { if(first[i] != second[i + 1]) return false; } return true; } else return false; } };
执行结果: ``` 执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了 73.72% 的用户 内存消耗:6 MB, 在所有 C++ 提交中击败了 85.87% 的用户 ```