文章

28

粉丝

226

获赞

53

访问

143.8k

头像
dp
推荐阅读
Sacan SVIP
P1730 西安电子科技大学2018年机试题
发布于2022年7月1日 23:01
阅读数 5.6k

 设字符串从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;
                }
         ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发