每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)相关的知识,希望对你有一定的参考价值。

选择题

1、假设你只有100Mb的内存,需要对1Gb的数据进行排序,最合适的算法是?
A 归并排序
B 插入排序
C 快速排序
D 冒泡排序

正确答案 A:

编程题

题目1

题目2
在这里插入图片描述
解题思路
每日一题 | day20(字符串反转 | 公共子串计算)有过类似的题,这里只要做特殊处理即可。就是增加一个公共子串的起始位置start,我们有了子串的最大长度,起始位置也很容易算出来,即start=i-max_len+1。
在这里插入图片描述
获得到最长公共子串的长度和起始位置,我们就可以在str1中根据这两个信息获得最长公共子串
代码

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

string getMaxComStr(string& str1, string& str2)
{
    if (str1.size() > str2.size())
        swap(str1, str2);
    int len1 = str1.size();
    int len2 = str2.size();
    
    vector<vector<int>> msc(len1, vector<int>(len2, 0));
    int max_len = 0;//公共子串的长度
    int start = 0;//公共子串起始位置
    for (int i = 0; i < len1; ++i)
    {
        for (int j = 0; j < len2; ++j)
        {
            if (str2[j] == str1[i])
            {
                if (i >= 1 && j >= 1)
                    msc[i][j] = msc[i - 1][j - 1] + 1;
                else
                    msc[i][j] = 1;//第一行或第一列需要特殊处理
                if (msc[i][j] > max_len)
                {
                    max_len = msc[i][j];
                    start = i - max_len + 1;
                }
            }
                
        }
    }
    string res = str1.substr(start, max_len);
    return res;
}

int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {
        cout << getMaxComStr(str1, str2) << endl;
    }
    return 0;
}

以上是关于每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)的主要内容,如果未能解决你的问题,请参考以下文章

day19—编程题

湖南省第6届程序设计大赛第一题 汽水瓶

每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)

1 元钱买一瓶汽水,两个空汽水瓶换一瓶汽水。现有 20 元钱,问最多可以喝到多少瓶汽水?

每日一题 | day12( 二进制插入 | 查找组成一个偶数最接近的两个素数)

C语言进阶之旅(每日一题)换汽水