字符串的组合
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取不同的值就可以得到所有的组合
上述方法只能处理没有重复字符的字符串,对重复的无法处理,希望知道的给我留言,谢谢了!
解题思路:
上述问题等价于在字符串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); } }
上述方法只能处理没有重复字符的字符串,对重复的无法处理,希望知道的给我留言,谢谢了!
相关文章推荐
- java字符串的排列组合
- 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
- 字符串的全排列和组合算法
- 解题笔记(21)——字符串的排列组合问题
- C# 路径拼接(将多个字符串组合成一个路径)
- 字符串的排列与组合
- 字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
- 我理解的剑指offer----字符串的全排列和组合算法
- 字符串的所有组合(非空子集)
- #牛客#代码实现:字符串的匹配、字符串的交错组成、纸牌博弈、表达式组合
- 编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成
- 字符串所有组合
- 求集合/字符串中的所有组合 (C语言)
- 字符串的全排列和组合算法
- 此函数用来判断传入的字符串参数是否全是字母数字的组合
- 【剑指offer】字符串的组合
- 程序员面试题精选100题(59)-字符串的组合[算法]
- [LeetCode]-Letter Combinations of a Phone Number 电话键盘的字符串组合
- 找出字符串至少两个顺序字段的所有组合
- 字符串的全排列和组合算法