一、題目介紹
字符串有三種編輯操作:插入一個字符、刪除一個字符或者替換一個字符。 給定兩個字符串,編寫一個函數判定它們是否只需要一次(或者零次)編輯。
示例 1:
輸入:
first = "pale"
second = "ple"
輸出: True
示例 2:
輸入:
first = "pales"
second = "pal"
輸出: False
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/one-away-lcci
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
二、解題思路
本題採用雙指針法,具體情況如下:
- 兩個字符串的長度之差不能大於1。
- 當first[i] == second[j]時,則i++, j++。
- 當first[i] != second[j]時,如果first[i+1] == second[j] ,則i++,count++(編輯次數);如果first[i] == second[j+1],則j++,count++;即可以通過刪除一個字符操作,使兩個字符串相同。
- 其他情況下,i++,j++,count++,即可以通過插入或者替換一個字符操作,使兩個字符串相同。
- 最後當i或j中某個指針,指向first或者second字符串的結尾時,統計max(first.size()-i, second.size()-j) + count的值,如果小於等於1返回true,否則返回false。
三、解題代碼
class Solution {
public:
bool oneEditAway(string first, string second) {
int len1 = first.size();
int len2 = second.size();
if(abs(len1-len2) > 1)
return false;
int i = 0, j = 0;
int count = 0;
while(i < len1 && j < len2)
{
if(first[i] == second[j])
{
++i;
++j;
}
else
{
//刪除一個字符
if(first[i+1] == second[j])
++i;
//刪除一個字符
else if(first[i] == second[j+1])
++j;
//插入一個字符,或者替換一個字符
else
{
++i;
++j;
}
++count;
}
}
if(max(len1-i, len2-j)+count > 1)//當某一個指針先到達字符串結尾時,即兩個字符串長度不一致的情況
return false;
return true;
}
};