leetcode : Interleaving String

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

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.

很明显的动态规划,以dp[i][j]表示s1取前i个字母,s2取前j个字母时,s3的前i + j个字母能否由s1,s2组成,

有状态转移公式:

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

AC代码:

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

        return dp[s1.size()][s2.size()];
    }
};

 

posted on 2014-11-24 15:03  远近闻名的学渣  阅读(168)  评论(0)    收藏  举报

导航