• 【牛客】【查找两个字符串a,b中的最长公共子串】【动态规划】


    查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网

    描述

    查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 

    注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开! 

    数据范围:字符串长度1≤length≤300 1≤length≤300 

    进阶:时间复杂度:O(n3) O(n3) ,空间复杂度:O(n) O(n) 

    输入描述:

    输入两个字符串

    输出描述:

    返回重复出现的字符

    示例1

    输入:

    abcdefghijklmnop
    abcsafjklmnopqrstuvw

    输出:

    jklmnop
    

    假设我们想要知道字符串

    s1:abcdefg

    s2:abycdefhz

    中的最长的公共子串的长度

    我们不妨列下面这样一张表

    这是我们的初始位置

    j所指向的是其上一个位置,也就是0号位置的a

    i 所指向的是其上一个位置,也就是0号位置的a

    默认我们整张表格中的元素初始化全部都是0

    然后我们发现j指向的a和我们i指向的a能够匹配上,所以

    1. if(str2[j-1]==str1[i-1])
    2. MSC[i][j]=MSC[i-1][j-1]+1

    也就是在我们表中的位置填写上1

    然后我们为了记录我们的最长子串

    所以我们的初始化最长子串的初始位置是

    start=0

    然后我们的最长子串的长度maxsize++,也就是从0变成了1

    start=0

    maxsize=1 

    j
    0123456789
    abycdefhz
    0a0
    i1b1
    2c
    3d
    4e
    5f
    6g
    7

     然后我们将i++

    然后j重新从1号位置开始往后匹配,寻找str2[j-1]=str1[i-1]的位置

    然后我们发现我们的j指向的b和我们i指向的b是能够匹配上的

    所以按照我们上面的匹配规则,我们在我们的下面的位置写上2

    start=0

    将我们的最大子串长度++

    maxsize=2 

    j
    0123456789
    abycdefhz
    0a0
    1b1
    i2c2
    3d
    4e
    5f
    6g
    7

     

    然后我们将i++

    此时i-1指向的是c

    然后j重新从1号位置开始往后匹配,寻找str2[j-1]=str1[i-1]的位置

    然后我们发现我们的j到4位置,指向j-1的位置的c的时候是可以和我们的i-1指向的c匹配上的

    start=0

    maxsize=2 

    此时我们只有c匹配上了,长度为1,我们是不需要更新我们的maxsize的。

    j
    0123456789
    abycdefhz
    0a0
    1b1
    2c20
    i3d1
    4e
    5f
    6g
    7

     

    然后我们将i++

    此时i-1指向的是d

    然后j重新从1号位置开始往后匹配,寻找str2[j-1]=str1[i-1]的位置

    然后我们发现我们的j到5位置,指向j-1的位置的d的时候是可以和我们的i-1指向的c匹配上的

    start=0

    maxsize=2 

    此时我们只有cd匹配上了,长度为2,我们是不需要更新我们的maxsize的。

    j
    0123456789
    abycdefhz
    0a0
    1b1
    2c20
    3d1
    i4e2
    5f
    6g
    7

     

    然后我们将i++

    此时i-1指向的是e

    然后j重新从1号位置开始往后匹配,寻找str2[j-1]=str1[i-1]的位置

    然后我们发现我们的j到6位置,指向j-1的位置的e的时候是可以和我们的i-1指向的c匹配上的

    上次一的start和maxsize是下面的数值

    start=0

    maxsize=2

    我们此时的size=3大于我们之前的2,所以我们需要更新我们的maxsize

    也就是

    maxsize=3

    start=i-maxsize=2

    j
    0123456789
    abycdefhz
    0a0
    1b1
    2c20
    3d1
    4e2
    i5f3
    6g
    7

     

    然后我们将i++

    此时i-1指向的是f

    然后j重新从1号位置开始往后匹配,寻找str2[j-1]=str1[i-1]的位置

    然后我们发现我们的j到7位置,指向j-1的位置的f的时候是可以和我们的i-1指向的c匹配上的

    上次一的start和maxsize是下面的数值

    start=2

    maxsize=3

    我们此时的size=4大于我们之前的3,所以我们需要更新我们的maxsize

    也就是

    maxsize=4

    start=i-maxsize=2

    j
    0123456789
    abycdefhz
    0a0
    1b1
    2c20
    3d1
    4e2
    5f3
    i6g4
    7

    然后我们的i++,i-1所指向的是g,我们的j是找不到匹配的,我们的搜索就结束了

    然后我们就返回

    s1.substr(start,maxsize)

    就能够将我们的最长子串给取出来的了。

    也就是我们的cdef。 

    代码实现 

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. string getComSubstr(string& str1, string& str2) {
    6. //寻求最短字符串
    7. if (str1.size() > str2.size())
    8. swap(str1, str2);
    9. int len1 = str1.size();
    10. int len2 = str2.size();
    11. vectorint>> MSC(len1 + 1, vector<int>(len2 + 1, 0));
    12. int start = 0, max_size = 0;
    13. for (int i = 1; i <= len1; ++i) {
    14. for (int j = 1; j <= len2; ++j) {
    15. if (str2[j - 1] == str1[i - 1])
    16. MSC[i][j] = MSC[i - 1][j - 1] + 1;
    17. //如果有更长的公共子串,更新长度
    18. if (MSC[i][j] > max_size) {
    19. max_size = MSC[i][j];
    20. //以i结尾的最大长度为max, 则子串的起始位置为i - max
    21. start = i - max_size;
    22. }
    23. }
    24. }
    25. return str1.substr(start, max_size);
    26. }
    27. int main() {
    28. string str1, str2;
    29. while (cin >> str1 >> str2) {
    30. string substr = getComSubstr(str1, str2);
    31. cout << substr << endl;
    32. }
    33. return 0;
    34. }

     

  • 相关阅读:
    Spring Security使用总结五,加密用户密码,不再使用明文保存密码
    想知道ppt怎么转成pdf格式?这些转换妙招可以轻松实现
    IDEA 创建 Servelet 项目
    django学习入门系列之第二点《案例1:用户注册》
    MSE 结合 Dragonwell,让 Java Agent 更好用
    26 - 数据分析与Excel(Excel 快速入门上)
    大数据常见面试题
    MATLAB程序设计与应用 3.5 稀疏矩阵
    vue中如何使用swiper以及解决swiper初始化过早的问题
    淘宝/天猫如何获得店铺的所有商品?
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/127759423