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

选择题

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

正确答案 A:

编程题

题目1

题目2
每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)
解题思路
每日一题 | day20(字符串反转 | 公共子串计算)有过类似的题,这里只要做特殊处理即可。就是增加一个公共子串的起始位置start,我们有了子串的最大长度,起始位置也很容易算出来,即start=i-max_len+1。
每日一题 | day19(汽水瓶 | 查找两个字符串 a,b 中的最长公共子串)
获得到最长公共子串的长度和起始位置,我们就可以在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;
}
上一篇:python学习笔记——os模块


下一篇:修改spring启动图标