LeetCode No.97 Interleaving String

来源:互联网 发布:该域名升级访问中 编辑:程序博客网 时间:2024/05/16 03:38

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.

===================================================================

题目链接:https://leetcode.com/problems/interleaving-string/

题目大意:判断s3是否由s1和s2构成。

思路:有两种做法,第一种是递归(超时),第二种是动归DP。

动态规划思路:

假设s1长度为n,s2长度为m。

使用二维bool数组dp[n][m],其中dp[i][j] 表示用s1的前i个(0 - i-1)和s2的前j个(0 - j-1)能否到达。

如样例所示,可以画成下面这张表


只需判断能否到达dp[n][m]即可。

参考代码:

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        int n = s1.size() , m = s2.size() , s = s3.size() , i = 0 , j = 0 ;        if ( s != n + m )            return false ;        vector < vector <bool> > dp ( n + 1 , vector <bool> ( m + 1 , false ) ) ;        // dp[i][j] 表示用s1的前i个(0 - i-1)和s2的前j个(0 - j-1)能否到达        for ( int i = 0 ; i <= n ; i ++ )        {            for ( int j = 0 ; j <= m ; j ++ )            {                if ( i == 0 && j == 0 )                    dp[i][j] = true ;                else if ( i == 0 )                {                    if ( dp[i][j-1] )                        dp[i][j] = s2[j-1] == s3[j-1] ? true : false ;                }                else if ( j == 0 )                {                    if ( dp[i-1][j] )                        dp[i][j] = s1[i-1] == s3[i-1] ? true : false ;                }                else                {                    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[n][m] ;    }};


递归代码(超时):

class Solution {public:    bool isInterleave(string s1, string s2, string s3) {        int n = s1.size() , m = s2.size() , s = s3.size() , i = 0 , j = 0 ;        if ( s != n + m )            return false ;        vector < vector <int> > record ;        for ( int k = 0 ; k < s ; k ++ )        {            if ( i < n && s1[i] == s3[k] )            {                if ( j < m && s2[j] == s3[k] )                {                    vector <int> temp ;                    temp.push_back ( k ) ;                    temp.push_back ( i ) ;                    temp.push_back ( j + 1 ) ;                    record.push_back ( temp ) ;                }                i ++ ;            }            else if ( j < m && s2[j] == s3[k] )            {                j ++ ;            }            else            {                if ( record.empty() )                    return false ;                vector <int> temp = record.back() ;                record.pop_back() ;                k = temp[0] ;                i = temp[1] ;                j = temp[2] ;            }        }        return true ;    }};



0 0