97. Interleaving String

问题描述:

 

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

Example 1:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Output: true

Example 2:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Output: false

 

解题思路:

一开始我想用dfs,若当前s3的首字符能与s1的匹配,则匹配s1.substr(1) , s2, s3.substr(1)

若不成功则检查s3能否与s2匹配,若能则匹配s1, s2.substr(1), s3

超时了:)超时了!!!!!!!!!!!!我就知道hard没有这么简单啊朋友们TAT

 

遇到这样的字符匹配的题可以考虑dp

类似题目:72. Edit Distance

dp[i][j]表示s1前i个字符和s2前j个字符能否插入式构成 s3 前 i+j 个字符串

初始化:

当i = 0, j = 0 时,代表前0个字符串,所以一定为true

dp[i][0] = dp[i-1][0] && (s1[i-1] == s3[i-1])

dp[0][i] = dp[0][i-1] && (s2[i-1] == s3[i-1])

状态转移方程:

dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i-1] ) || (dp[i][j-1] && s1[j-1] == s3[j-1])

最后返回dp[len1][len2]

代码:

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int len1 = s1.size();
        int len2 = s2.size();
        if(len1+len2 != s3.size())
            return false;
        vector<vector<bool>> dp(len1 + 1, vector<bool>(len2+1, false));
        dp[0][0] = true;
        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 <=len2; i++){
            dp[0][i] = dp[0][i-1] && (s2[i-1] == s3[i-1]);
        }
        for(int i = 1; i <= len1;i++){
            for(int j = 1; j <= len2; j++){
                dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i+j-1]) ||(dp[i][j-1] && s2[j-1] == s3[i+j-1]);
            }
        }
        return dp[len1][len2];
    }
};

 

posted @ 2018-06-11 11:58  妖域大都督  阅读(142)  评论(0编辑  收藏  举报