字符串的组合——《编程之法》课后题答案

来源:互联网 发布:外设天下淘宝店可靠吗 编辑:程序博客网 时间:2024/06/05 14:18

字符串的所有组合
如果求字符串的所有排列,而是求字符串的所有组合,当输入的字符串是“abc”则它的组合有“a”“b”“c”“ab”“ac”“bc”“abc”。

N个字符的全部组合问题可以分解成从N中1至N个字符组合,而对于从N中取M个数组合,可以分为以下两种情况:
①取这N个字符中的第一个字符,再从后面N-1个字符中取M-1个;
②不取这N个字符中的第一个字符,再从后面N-1个字符中取出M个;
可以简单的理解为解的过程为一个二叉树每次都有选择和不选择两个选项,将选择的暂时存放在一个vector类中,每次递归字符串指针向后移动一位。

/*字符串的所有组合例如 “abc”输出“a”“b”“c”“ab”“ac”“bc”“abc”*/#include <iostream>#include <vector>using namespace std;void Combination(char * s, int n, vector<char> res);                 //从中取n个元素的组合输出int main(){    char sInput[] = "abcde";    vector<char> Result;    for (int i = 1; i <= strlen(sInput); i++)    {        Combination(sInput, i, Result);        cout << endl;    }    cin.get();    return 0;}void Combination(char * s, int n,vector<char> res)                {    /*    字符串的所有组合    输入:    *s       ---输入字符串              n       ---取出的符号数              res     ---保存结果    */    if (n>strlen(s)||s == NULL)    {        return;    }    if (n==0)    {        for (vector<char>::iterator temp = res.begin(); temp != res.end(); temp++)        {            cout << *temp;        }        cout << "  ";        return;    }    if (*s=='\0')    {        return;    }    else    {        Combination(s + 1, n, res);                               //不取第一位,从余下取n位        res.push_back(*s);                                        //将第一位暂存        Combination(s + 1, n-1, res);                             //取第一位,从余下位取出n-1位        res.pop_back();    }}

运行结果
这里写图片描述
典型的递归问题,注意递归是否有明确的出口,否则会出现问题。

1 0
原创粉丝点击