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

来源:互联网 发布:家用路由器 知乎 编辑:程序博客网 时间:2024/05/19 18:16
链接: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];      }  };  



阅读全文
0 0
原创粉丝点击