给定一个字符串,输出其所有的可能排列
2013-09-10 17:10
246 查看
转载请注明来自souldak,微博:@evagle
Question:
给你一个字符串例如abb输出它包含的字符的所有可能排列。
例如abb输出3个:abb,bab,bba
Answer:
假设我们自己来做,那做法如下:
1. 有n个字符相当于n个格子。
2. 先放第一个格子,从n个字符中任选一个,放到这个格子即可,放完就剩下n-1个格子和n-1个字符
3. 放第二个格子,从n-1个字符中任选一个
。。。
n. 最后一个格子,只剩下一个字符,不用选,输出放好的结果
第二步到第n步其实问题本质是一样的,k个字符选一个,放到格子里即可。problem与subproblem的关系,所以我们可以用递归求解。
1. 获得字符串s,得到长度n
2. 轮询确定s[0]放哪个字符,共有n个,如果放第k个,就把s[k]放到s[0],s[0]放到s[k]
3. 放好后就求解子问题,即求s[1]~s[n-1]的排列
4. 如果已经求解到s[n-1],输出结果
Attention:传入的str应该是char数组,不能是这样定义的:char* str = "abc"; 具体为什么请参看:C/C++中char* 与char
[]定义的区别
Question:
给你一个字符串例如abb输出它包含的字符的所有可能排列。
例如abb输出3个:abb,bab,bba
Answer:
假设我们自己来做,那做法如下:
1. 有n个字符相当于n个格子。
2. 先放第一个格子,从n个字符中任选一个,放到这个格子即可,放完就剩下n-1个格子和n-1个字符
3. 放第二个格子,从n-1个字符中任选一个
。。。
n. 最后一个格子,只剩下一个字符,不用选,输出放好的结果
第二步到第n步其实问题本质是一样的,k个字符选一个,放到格子里即可。problem与subproblem的关系,所以我们可以用递归求解。
1. 获得字符串s,得到长度n
2. 轮询确定s[0]放哪个字符,共有n个,如果放第k个,就把s[k]放到s[0],s[0]放到s[k]
3. 放好后就求解子问题,即求s[1]~s[n-1]的排列
4. 如果已经求解到s[n-1],输出结果
Attention:传入的str应该是char数组,不能是这样定义的:char* str = "abc"; 具体为什么请参看:C/C++中char* 与char
[]定义的区别
//rm_dup: true for remove duplicated strings void permutation(char* str, int start, bool rm_dup){ if(str==NULL||str=="") return; if(start==strlen(str)-1) cout<<str<<endl; bool visit[256]; memset(visit,0,sizeof(visit)); for(int i=start;i<strlen(str);i++){ if(!visit[str[i]]||!rm_dup){ visit[str[i]] = true; std::swap(str[start],str[i]); permutation(str,start+1,rm_dup); std::swap(str[start],str[i]); } } }
相关文章推荐
- 给定一个字符串,输出所有的排列组合方式
- 给定一个字符串,字符串中的*可以替换成0或1,输出所有可能的结果
- C#实现输入一个字符串输出该字符串字符的所有排列方式
- 给出一个函数来输出一个字符串的所有排列。
- 给定一个数组,n个数,打印所有可能的r位数的组合。例如{1,2,3,4}n=4,r=2.输出{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}
- 给出一个函数来输出一个字符串的所有排列
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- 给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应
- 给定一个字符串输出其全部排列的方法
- 给出一个函数来输出一个字符串的所有排列
- 给出一个函数来输出一个字符串的所有排列
- 滚雪球思路 计算一个字符串所有可能的排列顺序
- 算法40(字符串的排列,给出一个函数来输出一个字符串的所有排列)
- 3、给出一个函数输出字符串的所有排列
- 输入一个字符串,要求输出字符串中字符所有的排列,例如输入"abc",得到"abc","acb","bca","bac","cab","cba"
- 输出一个字符串所有排列。注意有重复字符
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
- 给定一个数字m和数字n,输出相应的所有排列
- 给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应。
- 给定一个字符串S,求所有长度小于等于3的子串出现的次数,输出结果按出现次数从大到小