动态规划-请编写一个高效算法,判断C串是否由A和B交错组成。

链接: https://www.nowcoder.com/questionTerminal/138f0ae35154438caf3d0072bd6ffef5
来源:牛客网

对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。

给定三个字符串A,BC,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。

测试样例:
"ABC",3,"12C",3,"A12BCC",6
返回:true
 
  
当成一个二维的动态规划问题:
例如
 
  
 
  
 
  
class Mixture {
public:
    bool chkMixture(string A, int n, string B, int m, string C, int v) {
        // write code here
        int dp[n+1][m+1] ;
        int i,j ;
         
        dp[0][0] = 1 ;//dp[i][j]表示A[0~i-1],B[0~j-1]与C[0~i+j-1]是否交错
        for( i=1; i<=n; i++ )
            if( A[i-1] == C[ i-1 ] ) dp[i][0] = 1 ;
            else break ;
        for( i=1; i<=m; i++ )
            if( B[ i-1 ] == C[ i-1 ] ) dp[0][i] = 1 ;
            else break ;
         
        for( i=1; i<=n; i++ )
            for( j=1; j<=m; j++ )
            if( dp[i-1][j] == 1 && dp[i][j-1]!=1 ) 
            {
                if( C[i+j-1] == A[ i-1 ] ) dp[i][j] = 1 ;
                else dp[i][j] = 0 ;
            }
            else if( dp[i-1][j] != 1 && dp[i][j-1]==1  )
            {
                if( C[i+j-1] == B[ j-1 ] ) dp[i][j] = 1 ;
                else dp[i][j] = 0 ;
                 
            }
            else if( dp[i-1][j] == 1 && dp[i][j-1] == 1  )
            {
                if( C[i+j-1] == B[ j-1 ] || C[i+j-1] == A[ i-1 ] ) dp[i][j] = 1 ;
                else dp[i][j] = 0 ;
            }
            else//都为0
                dp[i][j] = 0 ;
         
        return dp[n][m] ;
    }
};
class Solution {  
public:  
    bool dp[101][101];  
    bool isInterleave(string s1, string s2, string s3) {  
        // Start typing your C/C++ solution below  
        // DO NOT write int main() function      
        int size1 = s1.length();  
        int size2 = s2.length();  
        int size3 = s3.length();  
        if( size1 + size2 != size3) return false;  
          
        memset(dp, false, sizeof(bool)*101*101);  
        dp[0][0] = true;  
        for(int i = 1; i <= size1; ++i)  
            if(s1[i-1] == s3[i-1]) dp[i][0] = true;  
            else break;  
        for(int j = 1; j <= size2; ++j)  
            if(s2[j-1] == s3[j-1]) dp[0][j] = true;  
            else break;  
  
        int k;  
        for(int i = 1; i <= size1; ++i)  
            for(int j = 1; j <= size2; ++j)  
            {  
                k = i + j;  
                if(s1[i-1] == s3[k-1]) dp[i][j] = dp[i-1][j] || dp[i][j];  
                if(s2[j-1] == s3[k-1]) dp[i][j] = dp[i][j-1] || dp[i][j];  
            }  
        return dp[size1][size2];  
    }  
};  



你可能感兴趣的:(数据结构算法)