如何求两个字符串的最长公共子序列: 如:求串<1,0,0,1,0,1,0,1>和<0,1,0,1,1,0,1,1>的最长公共子序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何求两个字符串的最长公共子序列: 如:求串<1,0,0,1,0,1,0,1>和<0,1,0,1,1,0,1,1>的最长公共子序列相关的知识,希望对你有一定的参考价值。

参考技术A 算法导论-动态规划(第十五章)

最长公共子序列Lcs

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:
 
abcicba
abdkscab
 
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

Input

第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)

Output

输出最长的子序列,如果有多个,随意输出1个。

Sample Input

abcicba
abdkscab

Sample Output

abca
基础的lcs,要求输出任意一个最长公共子序列
写一个递归函数模拟之前寻找最长公共子序列的逆向过程,把每次取到的字符入栈,然后再输出就好了
#include<iostream>
#include<string>
#include<stack>
using namespace std;

int max(int a, int b) {
    return a > b ? a : b;
}

int map[1001][1001] = { 0 };
string str1, str2;
stack<char> str;

void fun(int i, int j) {
    if (i == 0 || j == 0) {
        return;
    }
    if (str1[i - 1] == str2[j - 1]) {
        str.push(str1[i - 1]);
        fun(i - 1, j - 1);
    }
    else {
        if (map[i - 1][j] > map[i][j - 1]) {
            fun(i - 1, j);
        }
        else {
            fun(i, j - 1);
        }
    }

}

int main() {

    cin >> str1 >> str2;
    for (int i = 0; i < str1.length(); i++) {
        for (int j = 0; j < str2.length(); j++) {
            if (str1[i] == str2[j]) {
                map[i + 1][j + 1] = map[i][j] + 1;;
            }
            else {
                map[i + 1][j + 1] = max(map[i][j + 1], map[i + 1][j]);
            }
        }
    }
    fun(str1.length(), str2.length());


    while (!str.empty()) {
        cout << str.top();
        str.pop();
    }

    return 0;
}

 

以上是关于如何求两个字符串的最长公共子序列: 如:求串<1,0,0,1,0,1,0,1>和<0,1,0,1,1,0,1,1>的最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章

最长公共子序列

c++求两个字符串的最长公共子序列and子串

MATLAB 最长公共子序列

最长公共子序列(lcs)

最长公共子序列Lcs

最长公共子序列