《剑指Offer》:求字符串的组合

来源:互联网 发布:java 泛型类获取class 编辑:程序博客网 时间:2024/05/13 23:45

前言


       最近一个月多的时间一直在刷剑指Offer,刚做到第28题 -- 字符串的排列。然后,在做扩展题的时候,来了个神来之笔,心情大好,分享下。


题目: 


       求字符串(或n个字符)的所有组合。比如,输入abc,则它的组合有a,b,c,ab,ac,c,abc。

解决思路:


       求字符串的组合问题,可以分解成求长度为1的组合,长度为2的组合,...,长度为n的组合。所以,我们可以将这个题转换成具体求n个字符中长度为m (1 ≤ m ≤ n) 的组合问题。

       求长度为m的组合问题,我们将n个字符分成两个部分:第一个字符和剩下所有字符。然后我们就可以将求n个字符中长度为m的组合问题继续分解成以下两个子问题:


       1.  如果所求的组合里含有第一个字符,则我们只需要求剩下所有字符里长度为m-1的组合;
       2.  如果所求的组合里没有含有第一个字符,则我们需要求剩下所有字符里长度为m的组合; 

       解决这样两个子问题,必须会考虑到用递归。以下是代码实现:

void CombinationCore(char *pComBuff, char *pBegin, unsigned int m){    if (*pBegin == '\0' && m != 0)    {        return;    }    if (m == 0)    {        printf("%s\n", pComBuff);        return;    }    // 包含第一个字符,在剩下的求m-1个字符的组合    pComBuff[m - 1] = *pBegin;  // 神来之笔// pComBuff为打印的组合字符串,一直卡在如何给pComBuff赋值的问题这;// 结果一个错误的尝试,完美的解决了这个问题,只是打印的顺序是倒序,一点不违反原题意思。    CombinationCore(pComBuff, (pBegin + 1), (m - 1));     // 不包含第一个字符,在剩下的求m个字符的组合    CombinationCore(pComBuff, (pBegin + 1), m);}void Combination(char* pStr){    if (pStr == NULL)    {        return;    }    unsigned int len = strlen(pStr);    char *pComBuff = new char[len + 1];    memset(pComBuff, 0, len + 1);        for (unsigned int m = 1; m <= len; m++)    {        CombinationCore(pComBuff, pStr, m);    }    delete[] pComBuff;}

测试结果:


       卡了我半天,结果一个错误尝试无意中搞定,写代码的乐趣,大概就在此了!

        

   








0 0
原创粉丝点击