LSC最长公共子序列c++实现

本文总结了邓俊辉版数据结构中关于最长公共子序列(LCS)的学习,探讨了两种方法:递归和动态规划。递归方法时间复杂度高,而动态规划通过填充矩阵避免重复计算,提高了效率。在动态规划的实现中,通过标记数组记录搜索方向,最终求得准确的最长公共子序列。
摘要由CSDN通过智能技术生成

邓俊辉版数据结构,动态规划求解最长公共子序列学习总结。
第一种方法是通过递归实现。思路如下,两字符串长度长度分别为 a,b,比较他们的末位字符,这里是有三种情况

  1. 若有一方长度为零,则返回“”,这是递归方程的递归基。
  2. 若两字符串的末位字符相同,去掉末尾字符,返回规模递减的问题f(a-1,b-1)。这里是“减而治之”策略。
  3. 若两字符串末位字符不同,则有两种情况通过比较(a-1,b) 和(a,b-1)长度的字符串的最长公共子序列的长度,像长度较大的方向继续进行递归,返回f(a-1,b)或f(a,b-1),这里用的是“分而治之”策略。

实现代码如下



#include <iostream>
using namespace std;
string substring = ""; 
string lcs(string s1,string s2);
int main(){
   
    string s1, s2;
    cout << "please enter the first string\n";
    cin >> s1;
    cout << "please enter the second string\n";
    cin >> s2;
    cout<<"the longest conmmon subsequence is "<<lcs(s1, s2);
}
string lcs(string s1,string s2){
      
    int a,b;
    a = s1.length()-1;
    b = s2.length()-1;
    if(a==-1||b==-1){
   
        //substring += "";
        //reverse(substring.begin(),substring.end());
        return "";
    }
    else if(s1[a]==s2[b]){
   
        //substring += s1[a];
        char m = s1[a];
        s1 = s1.substr(0, a);
        s2 = s2.substr(0, b);
        return lcs(s1,s2)+m;
    }
    else{
   
        string s11 = s1.substr(0, a);
        string s22 = s2.substr(0, b);
        int l1 = lcs(s11, s2).length();
        int l2 = lcs(s1, s22).length();
        if(l1>l2){
   
            s1 = s11;
            return lcs(s1,s2);
        }
        else{
   
            s2 = s22;
            r
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值