求最大公共子序列的长度

本文介绍了一种利用动态规划解决求两个字符串最大公共子序列长度的方法。通过建立dp数组,逐字符比较,当字符相等时取前一状态加1,不等时取上或左状态的最大值,最终dp数组的右下角元素即为所求答案。并以实例解释了算法的执行过程。此外,还讨论了该方法在求解回文串删除问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求两个字符串的最大公共序列的长度,比较简单的思想就是利用动态规划的思想来实现。先直接贴代码:

//求两个字符串的最大公共子序列 
int getMaxLength(string str1,string str2){
    int len1 = str1.length();
    int len2 = str2.length();
    int dp[101][101];
    for(int i=0;i<len1;i++){
        for(int j=0;j<len2;j++){
            if(str1[i]==str2[j]){
                dp[i+1][j+1] = dp[i][j]+1;
            }else{
                dp[i+1][j+1] = max(dp[i][j+1] ,dp[i+1][j]);
            }
        }
    }
    return dp[len1][len2];
}

在代码中,利用dp数组来记录当前的到当前字符的最大公共子串。
假如:我们给str1赋值为abcd,给str2赋值为adcb。
我们的思想是这样的,先算出字符串a与字符串str2的最大公共子序列,发现a和str2的最大公共子序列为1,于是在a的基础基础上,计算字符串ad与str2的最大公共子序列的长度。以此类推,求出字符串str1与str2的最长子序列。
具体的实现过程结合下图可以比较清晰的看出来:
dp
当str1与str2中的字符相等时,就取上一个dp[i-1][j-1]+1作为当前的最大公共子串的长度,譬如途中的黄色标识的块。如果不想等,就去前面或者上面值的最大值最为当前元素的值。所以,我们可以知道,最后dp[len1][len2]一定是最大的,也是我们所要求的值。

程序运行的结果如图:
这里写图片描述

运用:
例如下面的题目:
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子:
abcda
google

输出例子:
2
2

参考ac代码:

#include<iostream>

using namespace std;

//求出最大公共子序列的长度 
int getMaxLength(string str){
    int dp[1001][1001]={0};
    string str2;
    int len = str.length();
    for(int i=0;i<len;i++){
        str2[i]= str[len-i-1];
    }

    for(int j=0;j<len;j++){
        for(int i=0;i<len;i++){
            if(str[i]==str2[j]){
                dp[i+1][j+1]=dp[i][j]+1;
            }else{
                dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
            }
        }
    } 
    return len-dp[len][len];
}



int main(){
    string str1;
    while(cin>>str1){
        cout<<getMaxLength(str1)<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值