プログラマーインタビューゴールデンクラシック-インタビューの質問01.05。1回の編集

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;
    }
};

4つの問題解決の結果

おすすめ

転載: blog.csdn.net/qq_39661206/article/details/105628501