题解 | #公共子串计算#C++动规标准(带图解示意)

公共子串计算

http://www.nowcoder.com/practice/98dc82c094e043ccb7e0570e5342dd1b

最近一直在做各种动规 又做回来了 写个题解
举个例子 子串是dbc 公串是abcde
先初始化一个3行5列的数组record,初始化第0行和第0列

     a b c d e
d    0 0 0 1 0
b    0
c    0

相等的初始化为1,不相等的填充0就行了。之后从第1行第1列开始对比,如果相等,则当前位置的值为左上角的值+1,例如在对比第1行第1列时,b和b相等 则record[1][1] = 1

     a b c d e
d    0 0 0 1 0
b    0 1 0 0 0
c    0

到第2行时,c和c相等,则那个位置的值等于bb位置的值+1,则填充2

     a b c d e
d    0 0 0 1 0
b    0 1 0 0 0
c    0 0 2 0 0

填充好后,数组中最大值就是最大公共子串长度,c++代码如下
#include <iostream>
using namespace std;</iostream>

int main()
{
    string a,b;

    while(cin>>a>>b)
    {
        int record[a.size()][b.size()];
        int count = 0;
        for(int i=0;i<b.size();i++)
        {
            if(a[0] == b[i])
                record[0][i] = 1;
            else
                record[0][i] = 0;
        }
        for(int i=0;i<a.size();i++)
        {
            if(b[0] == a[i])
                record[i][0] = 1;
            else
                record[i][0] = 0;
        }

        for(int i=1;i<a.size();i++)
        {
            for(int j=1;j<b.size();j++)
            {
                if(a[i] == b[j])
                {
                    record[i][j] = record[i-1][j-1]+1;
                    if(record[i][j] > count)
                        count = record[i][j];
                }
                else
                {
                    record[i][j] = 0;
                }
            }
        }
        cout<<count<<endl;
    }
}
全部评论
二维数组初始化,可以多一行一列,后面的遍历逻辑就一致了
点赞 回复 分享
发布于 2022-10-11 12:55 河北

相关推荐

10-17 09:06
门头沟学院 Java
8527睿:有些地方感觉不太契合实际啊。简单看看第二个项目那里。 比如canal流式读取数据库日志进行缓存同步那里。可不可以加个消息中间件来确保SQL语句的削峰填谷。一般都是canal+消息中间件 双层鉴权登录那里,描述有点模糊,登录是鉴权的前提唉,后面功能都在说是登录,鉴权没有啊
点赞 评论 收藏
分享
10-14 21:00
门头沟学院 Java
吃花椒的狸猫:这个人说的倒是实话,特别是小公司,一个实习生哪里来的那么多要求
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务