如何求两个字符串的最长公共子序列: 如:求串<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的最长公共子序列(子序列不要求是连续的)。
比如两个串为:abcicbaabdkscabab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。Input
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Sample Input
abcicba abdkscabSample 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>的最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章