每日一题 | 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 中的最长公共子串)的主要内容,如果未能解决你的问题,请参考以下文章
每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)
1 元钱买一瓶汽水,两个空汽水瓶换一瓶汽水。现有 20 元钱,问最多可以喝到多少瓶汽水?