【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)
原文地址:https://www.cnblogs.com/flix/p/13549659.html