【クイズのヒント】最長共通部分列、部分配列、編集距離

最長の共通部分列

ABCDE
エース

  • dp 配列の意味: 位置 i と j で終わる文字列の最長サブシーケンス長。
  • 漸化式:
    • 比較する 2 つの文字が同じ場合は、長さに 1 を加えます。
    • 比較した 2 つの文字が異なる場合は、max(vv[i-1][j],vv[i][j-1]) を取得します。

ここに画像の説明を挿入します

class Solution {
    
    
public:
    int longestCommonSubsequence(string text1, string text2) {
    
    
        vector<vector<int>> vv(text1.size()+1,vector<int>(text2.size()+1,0));
        //以i-1和j-1为结尾的两个串的最长子序列

        for(int i = 1;i<=text1.size();i++)
        {
    
    
            for(int j = 1;j<=text2.size();j++)
            {
    
    
                if(text1[i-1] == text2[j-1])
                {
    
    
                    vv[i][j] = vv[i-1][j-1] + 1;
                }
                else 
                {
    
    
                    vv[i][j] = max(vv[i-1][j],vv[i][j-1]);
                }

            }
        }
        return vv[text1.size()][text2.size()];
    }
};

最長の共通部分配列

  • dp 配列の意味: i、j 文字で終わるサブ配列の最大長
  • 漸化式:
    • 同じ場合: dp[i] = dp[i-1][j-1]+1、図の 2 と 1 の位置に示すように
    • それらが異なる場合: サブ配列が壊れているため、最初からカウントを開始する必要があることを意味するため、0 に設定します。
      ここに画像の説明を挿入します

距離を編集する

  • dp 配列の意味: i, j 文字で終わる文字列の最短編集距離
  • 漸化式:
    • それらが同じ場合: i-1 と j-1 は、末尾の文字列の最短編集距離です。つまり、編集は必要ありません。
    • 異なる場合: 最小のものを選択します
      • i-1 (文字列 A を 1 文字減らして文字列 Bになる最短編集距離)
      • j-1 (文字列 B を 1 文字減らして文字列 Aにする最短の編集距離)
      • 現在の文字を等しくしてから、文字列 A を文字列 B にします。
        ここに画像の説明を挿入します
class Solution {
    
    
public:
    int minDistance(string word1, string word2) 
    {
    
    
        vector<vector<int>> vv(word1.size()+1,vector<int>(word2.size()+1,0));
        //以i-1和j-1为结尾的两个串的最少编辑次数

        for(int i = 0;i<=word1.size();i++) vv[i][0] = i;
        for(int j = 0;j<=word2.size();j++) vv[0][j] = j;

        for(int i = 1;i<=word1.size();i++)
        {
    
    
            for(int j = 1;j<=word2.size();j++)
            {
    
    
                if(word1[i-1] == word2[j-1])
                {
    
    
                    vv[i][j] = vv[i-1][j-1];
                }
                else
                {
    
    
                    vv[i][j] = min({
    
    vv[i-1][j-1],vv[i][j-1],vv[i-1][j]}) + 1;
                }
            }
        }

        return vv[word1.size()][word2.size()];
    }
};

おすすめ

転載: blog.csdn.net/m0_73209194/article/details/132129952