【算法15】字符串的全排列
2011-12-08 22:43
330 查看
【题 目】输入一个字符串,打印该字符串的所有排列。例如输入字符串abc,输出其全排列为abc,acb,bac,bca,cab,cba。
【思 路】我们想一下,如果不编程,手工做的话,我们的基本考虑是:每次首先固定一个字母,然后让其余的字母全排列;然后换一个字母固定,再全排列其余的字母,如此循环而已。换句话说:假设长度为n的字符串排列方式是f(n),那么我们的基本思路是:每次让n个字母中的一个字母“打头阵”,其余的n-1个字母则按f(n-1)的方式排列。这样我们就明白这明显是递归思路。
递归最重要的问题是:结束的条件是什么?或者说,最小子问题是什么?还是以上面的abc例子来说明,首先固定a,然后排列bc;排列bc成为一个子问题,同样固定b,排列c;排列c成为子问题,固定c,剩下一个字符串结束符('\0');碰到结束符,前面的字符已经都排好了,所以我们只需要打印前面所有已经固定的字符就可以了。
根据这种思路,我们容易得到如下的代码:
运行结果如下:
![](http://pic002.cnblogs.com/images/2011/353956/2011120822282820.png)
【思路2】当然如果我们知道C++的库函数next_permutation,那么就不用这么麻烦了,因为库函数的算法都是封装的,所以没什么好说的,直接上代码:
运行结果如下:
![](http://pic002.cnblogs.com/images/2011/353956/2011120822391721.png)
References:
【1】何海涛博客:http://zhedahht.blog.163.com/blog/static/254111742007499363479/
【2】标准库全排列:http://hi.baidu.com/%D6%D5%BD%E1%D5%DF192/blog/item/a8ce8d23753d1eb64723e800.html
注:
1)本博客所有的代码环境编译均为win7+VC6。所有代码均经过博主上机调试。
2)博主python27对本博客文章享有版权,网络转载请注明出处http://www.cnblogs.com/python27/。对解题思路有任何建议,欢迎在评论中告知。
【思 路】我们想一下,如果不编程,手工做的话,我们的基本考虑是:每次首先固定一个字母,然后让其余的字母全排列;然后换一个字母固定,再全排列其余的字母,如此循环而已。换句话说:假设长度为n的字符串排列方式是f(n),那么我们的基本思路是:每次让n个字母中的一个字母“打头阵”,其余的n-1个字母则按f(n-1)的方式排列。这样我们就明白这明显是递归思路。
递归最重要的问题是:结束的条件是什么?或者说,最小子问题是什么?还是以上面的abc例子来说明,首先固定a,然后排列bc;排列bc成为一个子问题,同样固定b,排列c;排列c成为子问题,固定c,剩下一个字符串结束符('\0');碰到结束符,前面的字符已经都排好了,所以我们只需要打印前面所有已经固定的字符就可以了。
根据这种思路,我们容易得到如下的代码:
#include<iostream> #include<string> using namespace std; void StringPermutation(char *str,char *perBegin) { if(str == NULL || perBegin == NULL) return; //如果开始排列的位置为结束符,打印结束符前的所有字符 if(*perBegin == '\0') { cout<<str<<endl; } else { for(char *pch = perBegin;*pch != '\0';++pch) { //交换第n个字符与第一个字符的位置 char temp = *pch; *pch = *perBegin; *perBegin = temp; //排列第一个字符后的所有字符 StringPermutation(str,perBegin + 1); //将第n个字符再与第一个字符交换过来 temp = *pch; *pch = *perBegin; *perBegin = temp; } } } void StringPermutation(char *string) { StringPermutation(string,string); } int main() { char p[] = "abc"; StringPermutation(p); return 0; }
运行结果如下:
![](http://pic002.cnblogs.com/images/2011/353956/2011120822282820.png)
【思路2】当然如果我们知道C++的库函数next_permutation,那么就不用这么麻烦了,因为库函数的算法都是封装的,所以没什么好说的,直接上代码:
#include<iostream> #include<string> using namespace std; void StringPermutation(char *str,char *perBegin) { if(str == NULL || perBegin == NULL) return; //如果开始排列的位置为结束符,打印结束符前的所有字符 if(*perBegin == '\0') { cout<<str<<endl; } else { for(char *pch = perBegin;*pch != '\0';++pch) { //交换第n个字符与第一个字符的位置 char temp = *pch; *pch = *perBegin; *perBegin = temp; //排列第一个字符后的所有字符 StringPermutation(str,perBegin + 1); //将第n个字符再与第一个字符交换过来 temp = *pch; *pch = *perBegin; *perBegin = temp; } } } void StringPermutation(char *string) { StringPermutation(string,string); } int main() { char p[] = "abc"; StringPermutation(p); return 0; }
运行结果如下:
![](http://pic002.cnblogs.com/images/2011/353956/2011120822391721.png)
References:
【1】何海涛博客:http://zhedahht.blog.163.com/blog/static/254111742007499363479/
【2】标准库全排列:http://hi.baidu.com/%D6%D5%BD%E1%D5%DF192/blog/item/a8ce8d23753d1eb64723e800.html
注:
1)本博客所有的代码环境编译均为win7+VC6。所有代码均经过博主上机调试。
2)博主python27对本博客文章享有版权,网络转载请注明出处http://www.cnblogs.com/python27/。对解题思路有任何建议,欢迎在评论中告知。
相关文章推荐
- 九章算法面试题15 字符串编辑距离
- 算法题:字符串的全排列
- 算法思维(递归)训练:输出字符串字符的全排列
- 算法-字符串之全排列
- 算法学习-字符串的全排列
- 剑指offer——字符串的排列(好题,扩展题也很好,全排列的算法)
- js-FCC算法-No repeats please字符串的全排列
- 算法笔记_025:字符串的全排列(Java)
- 字符串全排列生成算法
- 【算法题】字符串的全排列
- 算法-字符串全排列问题
- 算法习题53:字符串全排列问题
- 数组全排列算法(一)字符串数组全排列——逐个追加组合算法
- 算法练习 - 字符串的全排列(字典序排列)
- 【算法】字符串的全排列
- 算法题:字符串的全排列
- 算法-字符串的全排列
- [算法] 字符串的全排列 [dfs - 递归神技]
- 算法 - 输出一个字符串的全排列(C++)
- [算法] 字符串的全排列 [dfs - 递归神技]