【LeetCode-字符串】一次编辑
题目描述
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例:
输入:
first = "pale"
second = "ple"
输出: True
输入:
first = "pales"
second = "pal"
输出: False
题目链接: https://leetcode-cn.com/problems/one-away-lcci/
思路1
使用和编辑距离一样的方法计算两个字符串的编辑距离,然后判断编辑距离是否小于等于 1。代码如下:
class Solution {
public:
bool oneEditAway(string first, string second) {
int m = first.size();
int n = second.size();
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for(int i=0; i<=m; i++) dp[i][0] = i;
for(int j=0; j<=n; j++) dp[0][j] = j;
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
int a = dp[i-1][j] + 1;
int b = dp[i][j-1] + 1;
int c = dp[i-1][j-1];
if(first[i-1]!=second[j-1]) c++;
dp[i][j] = min(a, min(b, c));
}
}
if(dp[m][n]<=1) return true;
else return false;
}
};
- 时间复杂度:O(mn)
- 空间复杂度:O(mn)
思路2
使用双指针来做。使用 3 个指针:i, j, k。i, j 在 str1 上从两边向中间移动,i, k 在 str2 上从两边向中间移动,只有 str1[i]==str2[i] 时,i++;当 str1[j]==str2[k] 时,j--,k--,最后判断 j-i+1 和 k-i+1 是否小于等于 1. 代码如下:
class Solution {
public:
bool oneEditAway(string first, string second) {
int m = first.size();
int n = second.size();
if(abs(m-n)>1) return false;
int i = 0;
int j = m - 1;
int k = n - 1;
while(i<m && i<n && first[i]==second[i]) i++;
while(j>=0 && k>=0 && first[j]==second[k]){
j--;
k--;
}
return j-i+1<=1 && k-i+1<=1;
}
};
- 时间复杂度:O(max(m,n))
- 空间复杂度:O(1)