字符串交错组成--很优美的递归算法

问题:

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

代码如下:

class Mixture {
public:
    bool chkMixture(string A, int n, string B, int m, string C, int v) {
        if(v != m + n ) return false;
        if(v == 0) return true;
        if(n == 0) return B == C;
        if(m == 0) return A == C;
        if(A[0] == C[0] && B[0] != C[0])
            return chkMixture(&A[1],n-1,B,m,&C[1],v-1);
        else if(A[0] != C[0] && B[0] == C[0])
            return chkMixture(A,n,&B[1],m-1,&C[1],v-1);
        else if(A[0] == C[0] && B[0] == C[0])
            return chkMixture(A,n,&B[1],m-1,&C[1],v-1) || chkMixture(&A[1],n-1,B,m,&C[1],v-1);
        else return false;
    }
};

分别说明一下:
1.如果A和B的长度之和不等于C的长度,肯定为false;
2.如果C验证完毕,则v==0,此时程序完毕返回true,这是有人可能会说,要是v==0,但是m,n可能不为0,这不是应该返回false吗?这种情况在情况1中已经存在了,所有这里大胆的返回false;
3.若A是空串,则只需比较B和C是否相等即可,很好理解;
4.同3,若B是空串,则只需比较A和C是否相等即可,很好理解;
5.如果A的第一个字符和第C的第一个字符相等,但是B的第一个字符和第C的第一个字符不相等,则A继续向后比对,C继续向后比对,A和C的长度分别减1;
6.同5;
7.若如果A的第一个字符和第C的第一个字符相等,且B的第一个字符和第C的第一个字符相等,则当前C的首字符可以和A比对,也可以和B比对,故应该是5和6两种情况相或运算。
8.当前C的首字符和A和B的都不匹配,自然就是不能匹配,不符合题目要求,直接返回false。


递归的代码看起来很整齐,哈哈。。。

原文地址:https://www.cnblogs.com/sunp823/p/5601406.html