字符串所有组合
2014-08-09 21:32
169 查看
【问题】
输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
【分析解法1】
对于字符串中每个字符,只有两种情况:一种就是出现在组合中,一种是不出现在组合中。
【代码】
假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;第二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码:
输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入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; }
相关文章推荐
- 打印一个字符串中字符的所有组合
- 题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
- 读取一个字符串,并输出它里面字符的所有组合。
- 打印出一个字符串的所有组合的递归方式
- 字符串之输出所有字母组合相同的单词
- 使用Microsoft Visual Studio International Pack获得中文字符串的所有拼音组合(处理多音字)
- 找字符串的所有组合
- c# 组合字符串组成密码的所有可能
- SQLSERVER查询单个数据表所有字段名组合成的字符串脚本
- 输入一串不重复的字符串,列出所有可能的组合(java实现)
- 打印给定一字符串的所有字母组合——递归实现
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- 【每日面试题】输入一字符串,输出该字符串的所有组合
- 求一个字符串中所有字符的组合
- SQLSERVER查询单个数据表所有字段名组合成的字符串脚本
- 给定一个字符串,输出所有的排列组合方式
- 算法1(输出字符串的所有组合形式,例如 string s="abc" 输出所有形式 a,b,c,ab,bc,abc 可以与顺序无关)
- SQLSERVER查询单个数据表所有字段名组合成的字符串脚本
- 字符串之输出所有字母组合相同的单词
- 输入字符串,输出字符串所有组合