【日常刷题】最长公共子串

题目:

【日常刷题】最长公共子串_第1张图片## 链接:https://www.nowcoder.com/questionTerminal/210741385d37490c97446aa50874e62d?

分析

思想

首先,这是一个求最优解的题,“最长”->自然而然想到动态规划法
其次,这里题目要求必须以短的那个字符串作为基准,我们就必须要先找到短的那个字符串.
之后运用二维数组巧妙求解:
【日常刷题】最长公共子串_第2张图片我们将str1(短串)竖着放,str2(长串)横着放,形成一个二维数组,并且将数组中的每一个元素初始化为0,将这个数组命名为MCS(MAXComString->最长公共子串).
MCS中的元素则代表了相同子串的长度,在迭代的过程中我们还需要进行判断.

代码

#include
#include
#include
using namespace std;
string GetAns(string& s1,string s2)
{
    int start = 0;
    int maxnum = 0;
    int len1 = s1.size();
    int len2 = s2.size();
    if(len1 > len2)
    {
        swap(s1,s2);
    }
    vector<vector<int>> MSC(len1 + 1,vector<int>(len2 + 1 , 0));
    for(int i = 1; i <= len1; i++)
    {
        for(int j = 1; j <= len2;j++)
        {
            if(s1[i -1] == s2[j - 1])
            {
                MSC[i][j] = MSC[i-1][j-1] + 1;
            }
            if(MSC[i][j] > maxnum)
            {
                maxnum = MSC[i][j];
                start = i - maxnum;
            }
        }
    }
    return s1.substr(start,maxnum);
}

int main()
{
    string s1,s2,res;
    cin >> s1 >> s2;
    res = "";
    res = GetAns(s1,s2);
    if(res.size() == 0) cout << "-1" << endl;
    cout << res << endl;
    return 0;
}

你可能感兴趣的:(算法,c++,开发语言)