您的位置:首页 > 其它

字符串的组合

2014-06-08 20:17 169 查看
题意:对一个字符串str,求其字符的所有组合。例如字符串abc,其组合就有a、b、c、ab、ac、bc、abc

解题思路:

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

将待处理的字符串分为两部分,第一个字符为第一部分,剩余的字符为第二部分。
取第一个字符作为子串的字符,那么在剩余的字符中就还需要取m-1个字符
不取第一个字符作为子串的字符,那么就需要在剩余的字符中取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);
}
}


上述方法只能处理没有重复字符的字符串,对重复的无法处理,希望知道的给我留言,谢谢了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串的组合