Find the longest common sub-sequence

Description:

Given 3 strings of all having length < 100,the task is to find the longest common sub-sequence
in all three given sequences.

Example:

Input : str1 = "geeks"
str2 = "geeksfor"
str3 = "geeksforgeeks"
Output : 5
Longest common subsequence is "geeks"
i.e., length = 5
Input : str1 = "abcd1e2"
str2 = "bc12ea"
str3 = "bd1ea"
Output : 3
Longest common subsequence is "b1e"
i.e. length = 3.

解题方法:

在两个string中寻找LCS:
假设string1的长度为m,string2的长度为n。
则我们创建一个m+1 * n+1的矩阵,矩阵DP[i][j]代表的是,当取string1前i个字符和取string2前j个字符时,它们的LCS长度为多少。
则状态转移方程为:

  1. 当string1[i - 1] == string2[j - 1], 则DP[i][j] = DP[i - 1][j - 1] + 1;这代表着当我们从string1和string2再各自取出一个字符,并且这两个字符相同,这两个substring的LCS的长+=1
  2. 否则,DP[i][j] = max(DP[i - 1][j], DP[i][j - 1]);

这道题是寻找两个string的LCS的升级版。
状态转移方程为:

  1. 当string1[x - 1] == string2[y - 1] == string3[z - 1], 则DP[x][y][z] = DP[x - 1][y - 1][z - 1] + 1;
  2. 否则,DP[x][y][z] = max(DP[x - 1][y][z], DP[x][y - 1][z], DP[x][y][z - 1]);

Time Complexity:

O(n^3)

完整代码:

int longestSubSequence(string& str1, string& str2, string& str3) {
    int size1 = str1.size(), size2 = str2.size(), size3 = str3.size();
    vector<vector<vector<int>>> DP(size1 + 1, vector<vector<int>>(size2 + 1, vector<int>(size3 + 1, 0)));
    for(int x = 1; x <= size1; x++) {
        for(int y = 1; y <= size2; y++) {
            for(int z = 1; z <= size3; z++) {
                if(str1[x - 1] == str2[y - 1] && str2[y - 1] == str3[z - 1]) {
                    cout<<str1[x]<<endl;
                    DP[x][y][z] = DP[x - 1][y - 1][z - 1] + 1;
                }   
            else
                    DP[x][y][z] = max(DP[x - 1][y][z], max(DP[x][y -1][z], DP[x][y][z - 1]));
            }
        }
    }
    return DP[size1][size2][size3];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,332评论 0 18
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,214评论 1 19
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,771评论 0 33
  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,265评论 0 6
  • thiele插值算法 1点插值算法 function [C,c]=thiele(X,Y,Z)%X为插值点横坐标,Y...
    00crazy00阅读 2,045评论 0 4