算法:
-
如果是公共子串,则末尾的字符一定相同。
-
设
dp[i][j]
为a[i]
和b[j]
之前的最大子串长度。 -
状态转移方程
if(a[i] == a[j]) dp[i][j] = dp[i-1][j-1] + 1 else dp[i][j] = dp[i-1][j-1]
代码:
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
const int MAX_N = 100;
string a, b;
int dp[MAX_N][MAX_N];
int main(){
memset(dp, 0, sizeof(dp));
int cnt = 0;
cin >> a >> b;
for(int i = 1; i < a.size(); i++){
for(int j = 1; j < b.size(); j++){
if(a[i] == b[j]){
dp[i][j] = dp[i-1][j-1] + 1;
if(cnt < dp[i][j]){
cnt = dp[i][j];
}
}else{
dp[i][j] = 0;
}
}
}
cout << cnt << endl;
return 0;
}