zoukankan      html  css  js  c++  java
  • 字符串最长子串匹配dp矩阵[转载]

    转自:https://blog.csdn.net/zls986992484/article/details/69863710

    题目描述:求最长公共子串,sea和eat.它们的最长公共子串为ea,长度为2.。

    #include <stdio.h>
    #include <string.h>
    #define N 50
    int main(){
        char s1[N],s2[N];
        int dp[N][N],i,j,max_len=0;
        while(scanf("%s%s",&s1,&s2)!=EOF){
            int len1=strlen(s1);
            int len2=strlen(s2);
            for(int i=0;i<len1;i++){
                for(int j=0;j<len2;j++){
                    if(i==0||j==0){
                        if(s1[i]==s2[j])
                            dp[i][j]=1;
                        else
                            dp[i][j]=0;
                    }else{
                        if(s1[i]==s2[j])
                            dp[i][j]=dp[i-1][j-1]+1;
                        else
                            dp[i][j]=0;
                    }
                if(dp[i][j]>max_len)
                    max_len=dp[i][j];
            }
    
        }
        printf("%d\n",max_len);
        }
    
        return 0;
    }

    //dp自己想真的好难,想不出来,dp[i][j]表示的是什么呢?就是s1[i]和s2[j]中分别以i和j为结尾的子串(不一定包括i和j)最长匹配长度。那么很明显dp[i+1][j+1]=dp[i-1][j-1]+s[i]==s[j]?1:0;临界条件如何考虑呢?我写的还是比较简单的。O(m*n)的复杂度。

    如果是用最基本的方法,那么就是两层for循环,一个i一个j分别指向当前,并且内部可以有m=i,n=j去判断后面的字符是否匹配,i和j一直控制的是整个字符串匹配的位置,一开始一直想的是如果i和j变了,那么谁去控制整个数组的循环呢?但是可以把它俩复制给别的变量啊。表示s1从i开始,s2从j开始(包括i和j)匹配的长度。dp是和它反过来的。

  • 相关阅读:
    查看unity打来的包在手机上面查看日志
    Unity 打包出来动态加载图片丢失问题
    嵌套列表拖拽事件冲突问题
    游戏中实现鼠标拖尾效果
    2048
    面试知识点积累
    ARM处理器架构理论知识
    計算機網絡知識點總結:
    collection
    demo002.链表操作
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9232034.html
Copyright © 2011-2022 走看看