97. 交错字符串

题目

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。

示例 1:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出: true
示例 2:

输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出: false

思路

这道题的主要思路还是dp,s1的大小是size1,s2的大小是s2,构建一个(s1+1)*(s2+1)的矩阵。
dp[ i ][ j ]意味着以s1的前i个字符和s2的前j个字符是否能构造出s3的前i+j个字符的子串,是则为true,否则为false。(注意,dp[0][0]为真,意味着s1的前0个字符和s2的前0个字符,自然可以构建出s3的前0个字符)
dp方程是
dp[ i + 1 ][ j ] == true (dp[ i ][ j ] == true , s1[ i ] == s3[ i + j ])
dp[ i ][ j + 1] == true (dp[ i ][ j ] == true , s2[ j ] == s3[ i + j ])
直观来讲就是每次检查s1和s2的子串是否能构造出s3的前i+j个字符的子串时,遍历矩阵的一条斜线,然后扩展出一条新的斜线。

代码

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

                    if(s2[j] == s3[nowIndex]){
                        dp[i][j + 1] = true;
                    }
                }
            }
        }
        return dp.back().back();
    }
};


你可能感兴趣的:(LeetCode)