zoukankan      html  css  js  c++  java
  • LeetCode 97 交错字符串

    题目大意是给三个字符串,问前两个字符串进行交错是否可以组成第三个字符串。我的思路就是用动态规划来做,用一个数组dp[i][j]表示匹配s3前i+1个字符时,用了j个s1的字符,s2可以推倒出来是用了i+1-j个字符,所以不用再开一维,两维就够了,第一次做多开了一维,时间和空间消耗都很大。更新dp数组的公式dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1)和dp[i][j]=max(dp[i][j],dp[i-1][j]+1);分别是匹配s3索引为i的字符时,用s1去匹配和用s2去匹配,要注意字符串的界限,不要越界。这样子做时间空间消耗都非常低。

    
    class Solution {
    public:
        bool isInterleave(string s1, string s2, string s3) {
            int len1 = s1.length(),len2 = s2.length(),len3 = s3.length();
            if(len3!=len1+len2) return false;
            if(len3==0) return true;
            int dp[len3+5][len1+5];
            memset(dp,0,sizeof(dp));
            if(s1[0]==s3[0]) dp[0][1]=1;
            if(s2[0]==s3[0]) dp[0][0]=1;
            for(int i=1;i<len3;i++)
            {
                for(int j=0;j<=len1&&j<=i+1;j++)
                if(j<=len1&&i-j+1<=len2)
                {
                    if(j>0&&s1[j-1]==s3[i])
                    dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
                    if(i>=j&&s2[i-j]==s3[i])
                    dp[i][j]=max(dp[i][j],dp[i-1][j]+1);
                }
            }
            if(dp[len3-1][len1]==len3) return true;
            else
            return false;
        }
    };
    
  • 相关阅读:
    JAVA学习前应该了解
    JAVA帝国的诞生
    常用的快捷方式
    MarkDown学习
    运动检测
    图像分割
    感知机
    线性判别函数
    距离
    概率密度估计笔记——非参数估计
  • 原文地址:https://www.cnblogs.com/ambition-hhn/p/12938956.html
Copyright © 2011-2022 走看看