zoukankan      html  css  js  c++  java
  • 字符串交错组成--很优美的递归算法

    问题:

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


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

  • 相关阅读:
    VS2010 MFC对话框程序用CButtonST给按钮添加图标
    VS2010 MFC 使用GDI+给图片添加汉字
    C++ Primer(第4版)-学习笔记-第2部分:容器和算法
    C++ 面向对象编程
    C++类(Class)总结
    delegate、notification、KVO场景差别
    iOS block种类和切换
    Copy 与MutableCopy的区别
    ios 避免循环引用
    WKInterfaceImage 无法更新图片的问题
  • 原文地址:https://www.cnblogs.com/sunp823/p/5601406.html
Copyright © 2011-2022 走看看