【每日一练】day(14)


一、选择题

eg1

在这里插入图片描述
在这里插入图片描述

eg2

在这里插入图片描述

eg3

在这里插入图片描述

eg4

在这里插入图片描述

eg4

在这里插入图片描述

eg5

在这里插入图片描述

eg6

在这里插入图片描述

eg7

在这里插入图片描述

eg8

在这里插入图片描述

eg9

在这里插入图片描述

eg10

在这里插入图片描述

eg11

在这里插入图片描述

eg12

在这里插入图片描述

eg13

在这里插入图片描述

eg14

在这里插入图片描述

二、编程题

eg1

在这里插入图片描述

【解题思路】:
本题需要用动态规划求解,MCS[i][j]记录短字符串 s1 前 i 个字符和长字符串 s2 前 j 个字符的最长子串的长度,初始化所有值为 0。当 s1[i-1] = s2[j-1]时,MCS[i][j] = MCS[i - 1][j - 1] + 1,这里使用一个额外的值start 来记录最长子串在短字符串 s1 中出现的起始位置,maxlen记录当前最长子串的长度,当MCS[i][j] >maxlen 时,maxlen = MCS[i][j], 则start = i - maxlen ;档s1[i-1] != s2[j-1]时不需要任何操作,最后获取substr(start, maxlen)即为所求

#include <iostream>
#include <string>
#include <vector>
using namespace std;

string GetSubStr(string& s1, string& s2)
{
    if(s1.size() > s2.size())
        swap(s1, s2);
    int len1 = s1.size();
    int len2 = s2.size();
    //多开辟一行一列,初始化为0
    vector<vector<int>> MSC(len1+1, vector<int>(len2+1, 0));
    int max_size = 0;
    int start = 0;
    for(int i = 1; i < len1; ++i)
    {
        for(int j  = 1; j < len2; ++j)
        {
            if(s2[j-1] == s1[i-1])
                MSC[i][j] = MSC[i-1][j-1] + 1;
            if(MSC[i][j] > max_size)
            {
                max_size = MSC[i][j];
                start = i - max_size;
            }
        }
    }
    return s1.substr(start, max_size);
}

int main()
{
    string s1;
    string s2;
    while(cin >>s1 >> s2)
    {
        string ret = GetSubStr(s1, s2);
        cout << ret << endl;
    }
    return 0;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小唐学渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值