面试题 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;
}
};