【刷题点滴】最长公共子序列、子数组、编辑距离

最长公共子序列

abcde
ace

  • dp数组含义:以i和j位置结尾的字符串的最长子序列长度。
  • 递推公式:
    • 如果比较的两个字符相同,长度加一
    • 如果比较的两个字符不同,取max(vv[i-1][j],vv[i][j-1])

【刷题点滴】最长公共子序列、子数组、编辑距离_第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
      【刷题点滴】最长公共子序列、子数组、编辑距离_第2张图片

编辑距离

  • dp数组含义:以i、j字符结尾的字符串最短编辑距离
  • 递推公式:
    • 如果相同:i-1、j-1为结尾的字符串的最短编辑距离,即不需要编辑
    • 如果不同:取其中最小
      • i-1(减少 A串的的一个字符后再 变成 B串的最短编辑距离)
      • j-1(减少 B串的的一个字符后再 变成 A串的最短编辑距离)
      • 让当前字符相等,再让A串变成B串
        【刷题点滴】最长公共子序列、子数组、编辑距离_第3张图片
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()];
    }
};

你可能感兴趣的:(算法,c++)