【LeetCode-字串】一次編輯
阿新 • • 發佈:2020-08-23
題目描述
字串有三種編輯操作:插入一個字元、刪除一個字元或者替換一個字元。 給定兩個字串,編寫一個函式判定它們是否只需要一次(或者零次)編輯。
示例:
輸入:
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)