字符串所有组合

【问题】

输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

【分析解法1】

对于字符串中每个字符,只有两种情况:一种就是出现在组合中,一种是不出现在组合中。

【代码】

void combination(char *str, char *res, int strPos, int resPos, int size)
{
	if (strPos == size) {
		res[resPos] = '\0';
		printf("%s\n", res);
		return;
	}
	combination(str, res, strPos+1, resPos, size);//str[strPos]不出现在组合中。
	res[resPos] = str[strPos];
	combination(str, res, strPos+1, resPos+1, size);//str[strPos]出现在组合中。
}

【分析解法2(网上转载)】

假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#include<assert.h>  

void Combination(char *string ,int number,vector<char> &result);  

void Combination(char *string)
{
    assert(string != NULL);
    vector<char> result;
    int i , length = strlen(string);
    for(i = 1 ; i <= length ; ++i)
        Combination(string , i ,result);
}  

void Combination(char *string ,int number , vector<char> &result)
{
    assert(string != NULL);
    if(number == 0)
    {
        static int num = 1;
        printf("第%d个组合\t",num++);  

        vector<char>::iterator iter = result.begin();
        for( ; iter != result.end() ; ++iter)
            printf("%c",*iter);
        printf("\n");
        return ;
    }
    if(*string == '\0')
        return ;
    result.push_back(*string);
    Combination(string + 1 , number - 1 , result);
    result.pop_back();
    Combination(string + 1 , number , result);
}  

int main(void)
{
    char str[] = "abc";
    Combination(str);
    return 0;
}  

字符串所有组合,布布扣,bubuko.com

时间: 2024-10-18 23:02:53

字符串所有组合的相关文章

【剑指offer】字符串的组合

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26405471 剑指offer上的拓展题目,输入一个字符串,输出该字符串的字符的所有组合,比如输入字符串:abc,输出a.b.c.ab.ac.bc.abc. 思路:与上一题类似,也可以用递归求解.可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m).原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和.对于求C(n, m),从第一个字符开始扫描,每个字符有两种

55. 2种方法求字符串的组合[string combination]

[本文链接] http://www.cnblogs.com/hellogiser/p/string-combination.html [题目] 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. [分析] 在之前的博文28.字符串的排列[StringPermutation]中讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. [递归法求组合] 可以考虑求长度为n的字符串中m个字符的组合,

字符串排列组合问题

一.全排列无重复字符 #include<stdio.h> #include<string.h> char buf[1024]; void func(int index); void swap(int index1,int index2); int main() { memset(buf,0,sizeof(buf)); sprintf(buf,"abc"); func(0); return 0; } void func(int index) { if(index

字符串参数组合

字符串参数组合: 方法: public static function substring(str:String, ...rest):String { if (!str) { return ""; } var len:uint = rest.length; var args:Array; if (len == 1 && rest[0] is Array) { args = rest[0] as Array; len = args.length; trace("

字符串全组合(淘宝宝贝关键字)

小伙伴最近开了家淘宝店,每天为宝贝的名称弄得很麻烦,经常需要根据不同的关键字来组合宝贝的名称,但不知道啥组合能引入更多的流量,所以每个都试着弄弄看,所以这就需要一个字符串的组合. 在那个夜黑风高的晚上,小伙伴带着我去华强北吃了寿司,无意间谈了这个小东西,实现难度不高,立刻动手: 1 internal class Program 2 { 3 /* 4 思路:获取需要组合的字符串数组,循环读取字符串数组成立组合,再根据该组合循环再去组合,其实就是递归读取,用Contains判断是有包含即可 5 */

字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba . #include<stdio.h> #include<string.h> static int number=0; void Swap(char *a ,char *b) { char temp =

输出字符串所有组合

描述 输入字符串"abc",则输出a.b.c.ab.ac.bc.abc 共7种组合. 分析 方法一,递归法.遍历每个字符串,每个字符两种情况取或不取.时间复杂度为O(n的2次方). 方法二,根据每个字符只有取和不取两种情况,0表示不取,1表示取该字符,则原题可以解释为要求输001到111这个组合对应的字符串. 代码 方法一 public class Test { /* * 递归 * */ public static void combinate(char[] chars,int beg

字符串的组合个数

有一个MAP,KEY从a到z,对应的VALUE从1到26,比如: a = 1 b = 2 ... z = 26,对于一个数字字符串"11",可以由"aa"对应的数字组合,也可以由"k"对应的数字代表,对应组合的个数记为2:同样,比如"111"对应的组合个数是3,分别是"aaa", "ka", "ak". 给定一个数字数组,计算对应的组合个数. 解答:对于一个字符串,定

字符串的组合

引用剑指offer 1 //组合,从字符串str中取m个字符的所有组合,结果保存在vector中 2 void combination(char* str,int m,vector<char>& result){ 3 //有两个停止条件:m==0或者*str=='\0' 4 //先判断m 5 if(m==0){ 6 for(vector<char>::iterator it=result.begin();it!=result.end();it++) 7 cout<&l