列表

详情


OR17. 字符串交错组成

描述

对于三个字符串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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2021-01-30

class Mixture {
public:
    bool chkMixture(string A, int n, string B, int m, string C, int v) {
        // write code here
        if(n+m != v) return false;
        if(v == 0) return true;
        vector<vector<bool>> dp(n+1,vector<bool>(m+1,false));
        dp[0][0]=true;
        for(int i = 1; i <= n; i++){
            if(A[i-1] != C[i-1]) break;
            dp[i][0] = true;     
        }
        for(int j = 1; j <= m; j++){
            if(B[j-1] != C[j-1]) break;
            dp[0][j] = true;     
        }
        for(int i=1; i<=n; i++)
        
            for(int j=1; j<=m; j++)
            {
                if((A[i-1]==C[i+j-1]&&dp[i-1][j])||(B[j-1]==C[i+j-1]&&dp[i][j-1]))
                    dp[i][j] = true;
            }
        
        return dp[n][m];
                   
        
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 420KB, 提交时间: 2022-07-31

class Mixture {
public:
    bool ret = false;

    void match(string& A, int n, string& B, int m, string& C, int v) {
        if (v == C.size()) {
            ret = true;
        }
        if (n < A.size() && A[n] == C[v]) {
            match(A,n+1,B,m,C,v+1);
        }
        if (m < B.size() && B[m] == C[v]) {
            match(A, n , B, m+1, C, v + 1);
        }
    }

    bool chkMixture(string A, int n, string B, int m, string C, int v) {
        if (n + m != v) {
            return false;
        }
        match(A, 0, B, 0, C, 0);
        return ret;
    }
};

上一题