最長の共通部分列
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()];
}
};