面试题 01.05. 一次编辑
程序员文章站
2022-04-03 08:51:58
...
面试题 01.05. 一次编辑 - 力扣(LeetCode)
LeetCode第 72 题:编辑距离(C++)_zj-CSDN博客的简单版本,照抄即可:
class Solution {
public:
bool oneEditAway(string first, string second) {
int m = first.size(), n = second.size();
if(abs(m-n) > 1) return false;
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for(int i = 1; i <= m; ++i) dp[i][0] = 1 + dp[i-1][0];
for(int i = 1; i <= n; ++i) dp[0][i] = 1 + dp[0][i-1];
for(int i = 1; i <= m; ++i){
for(int j = 1; j <= n; ++j){
if(first[i-1] == second[j-1]) dp[i][j] = dp[i-1][j-1];
else dp[i][j] = 1 + min(min(dp[i][j-1], dp[i-1][j]), dp[i-1][j-1]);
}
}
return dp[m][n] < 2;
}
};
但是这样效率一般,因为我们只需要判断一步之内能否编辑成功就可以了,用不到这么复杂的逻辑:
class Solution {
public:
bool oneEditAway(string first, string second) {
if(first == second) return true;
int m = first.size(), n = second.size(), cnt = 1;//cnt表示最多编辑次数
int val = m-n;
if(val > 1 || val < -1) return false;
for(int i = 0, j = 0; i < m && j < n; ++i, ++j){
if(first[i] != second[j]){
if(val == 1) --j;//second添加一个字符,相当于回退一步
else if(val == -1) --i;//first添加一个字符
//val == 0时进行替换
--cnt;//一次编辑次数已经用完
if(cnt < 0) return false;
}
}
return true;
}
};
上一篇: 第一章 初识Java
下一篇: 面试题 01.03. URL化
推荐阅读
-
「建议心心」要就来15道多线程面试题一次爽到底(1.1w字用心整理)
-
剑指 offer代码最优解析——面试题35第一个只出现一次的字符
-
记一次使用mavon-editor编辑器的使用过程,添加自己的功能
-
【剑指offer】面试题56(1):数组中只出现一次的两个数字
-
剑指offer 面试题56 python版+解析:数组中只出现一次的两个数字,数组中唯一只出现一次的数字
-
剑指offer 面试题40 数组中只出现一次的数字
-
剑指offer:面试题40——数组中只出现一次的数字
-
【难题+重点】剑指offer——面试题40:数组中只出现一次的数字
-
【剑指Offer】面试题40:数组中只出现一次的数字
-
剑指Offer_面试题40_数组中只出现一次的数字