一、选择题
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;
}