题解 | #公共子串计算#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;
}
}