字符串交錯組成--很優美的遞歸算法

問題:

對於三個字符串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。


遞歸的代碼看起來很整齊,哈哈。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章