字符串的组合

题意:对一个字符串str,求其字符的所有组合。例如字符串abc,其组合就有a、b、c、ab、ac、bc、abc


解题思路:

上述问题等价于在字符串str中,求长度为1,2,3,...,n的子串的集合。现在要解决的问题就是在长度为n的字符串中求长度为m的子串有哪些。

  1. 将待处理的字符串分为两部分,第一个字符为第一部分,剩余的字符为第二部分。
  2. 取第一个字符作为子串的字符,那么在剩余的字符中就还需要取m-1个字符
  3. 不取第一个字符作为子串的字符,那么就需要在剩余的字符中取m个字符
因此上述问题就转化为了两部分,这两部分都可以递归实现。然后对m取不同的值就可以得到所有的组合

//求长度为n的字符串中m个字符的组合(m <= n), 将字符串分为两部分:第一个字符和剩余的字符,如果选择了第一个字符,那么就需要在剩下的字符中选择m-1个字符,如果没有选择第一个字符,那么就需要在剩下的字符中选择m
个字符
void Combination(const string &str, string::size_type begPos, int num, vector<char> &result)
{
    if(0 == num)
    {
        for(vector<char>::iterator citer = result.begin(); citer != result.end(); citer++)
        {
            cout << *citer;
        }
        cout << endl;
        return;
    }

    if(str.size() == begPos)
    {
        return;
    }

    //选择begPos位置的字符,然后在剩下的字符中选择m-1个字符
    result.push_back(str[begPos]);
    Combination(str, begPos + 1, num - 1, result);

    //不选择begPos位置的字符,然后在剩下的字符中选择m个字符
    result.pop_back();
    Combination(str, begPos + 1, num , result);
}

void Combination(const string &str)
{
    if(str.empty())
        return;

    int length = str.size();
    vector<char> result;

    for(int i = 1; i <= length; i++)
    {
        Combination(str, 0, i, result);
    }
}

上述方法只能处理没有重复字符的字符串,对重复的无法处理,希望知道的给我留言,谢谢了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值