【动态规划】interleaving string 两个字符串交叉得到另一个字符串

大致思路:

(via简书yoshino)

这种又是涉及两个子串的题,又用动态规划来做。但是有时候很不好想到动态规划的含义,我觉得就大胆一点吧....而且一般这种字符串的动态规划都是跟“长度”有关!然后再举简单的例子来模拟过程,从而设计出转移方程!

这道题过程看懂了就很好理解的,只是在编程要注意:dp数组下标从1开始,表示的是“第几个”或“有多长”,而字符串肯定是从0开始的。

AC代码:

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        bool dp[2000][2000]; 
        //dp[i][j]表示s3的前i+j个字符可以由s1的i个字符和s2的j个字符交叉而成
        
        int len1=s1.size();
        int len2=s2.size();
        int len3=s3.size();
        if(len1+len2!=len3) return false;
        
        //dp数组的初始化——一般就想某一维为0或为1的情况
        dp[0][0]=true; 
        for(int i=1;i<=len2;i++)
        {
            dp[0][i] = dp[0][i-1] && s2[i-1]==s3[i-1];
        }
        for(int i=1;i<=len1;i++)
        {
            dp[i][0] = dp[i-1][0] && s1[i-1]==s3[i-1];
        }
        
        
        for(int i=1;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                if(dp[i-1][j] && s1[i-1]==s3[i+j-1])
                    dp[i][j]=true;
                else if(dp[i][j-1] && s2[j-1]==s3[i+j-1])
                    dp[i][j]=true;
                else
                    dp[i][j]=false;
            }
        }
        return dp[len1][len2];
    }
};

猜你喜欢

转载自blog.csdn.net/m0_38033475/article/details/92201707