1.トピックの紹介
文字列の編集操作には、文字の挿入、文字の削除、文字の置換の3つがあります。2つの文字列が与えられた場合、1つ(または0)の編集のみが必要かどうかを判断する関数を記述します。
例1:
入力:
first = "pale"
second = "ple"
出力:True
例2:
入力:
first = "pales"
second = "pal"
出力:False
出典:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/one-away-lcci
著作権はLeetCodeが所有しています。商用の再版については、公式の承認に連絡してください。非商用の再版については、出典を示してください。
2つの問題解決のアイデア
この質問はダブルポインター方式を使用しており、詳細は次のとおりです。
- 2つのストリングの長さの差は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 ++;つまり、1つの文字を削除して、2つの文字列を同じにすることができます。
- その他の場合、i ++、j ++、count ++では、文字を挿入または置換して、2つの文字列を同じにすることができます。
- 最後に、iまたはjのポインタが最初または2番目の文字列の終わりを指している場合、max(first.size()-i、second.size()-j)+ countの値をカウントし、1以下の場合はtrueを返します。 、それ以外の場合はfalseを返します。
3つの問題解決コード
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;
}
};