文章
28
粉丝
226
获赞
53
访问
143.8k
设字符串从1开始编号(而不是0)
设dp[i][j]表示 以s1第i个字符结尾的子串 和 以s2第j个字符结尾的子串 这两个子串的最长公共子串的长度
则有:
dp[i][j] = 0, 当i==0或j==0 (因为其中一个或两个的长度都为0了哪里来的公共子串)
dp[i][j] = 0, 当s1[i-1] != s2[j-1],子串最后一个字符不相等,那么这两个子串就不是公共的
dp[i][j] = dp[i-1][j-1] + 当s1[i-1]==s2[j-1]
说起来还是感觉有些词不达意,尽量意会吧。。。
#include
#include
using namespace std;
int main()
{
string s1,s2;
while(cin >> s1 >> s2){
int n = s1.size();
int m = s2.size();
vector> dp(n+1, vector(m+1,0));
int ans = 0;
int s1_i = 0;
int s2_j = 0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(s1[i-1] == s2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = 0;
}
if(ans <= dp[i][j]){
ans = dp[i][j];
s1_i = i;
s2_j = j;
}
...
登录后发布评论
暂无评论,来抢沙发