1. 程式人生 > 實用技巧 >【LeetCode-字串】一次編輯

【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[j] 時,j--,最後判斷 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)