输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
对于一个字符来说,只有一个排列就是其自身,那么对于多个字符的组合来说,也是有规律可循的:可以在字符串中选出一个字符来固定出头部,比如上述先用a来开头,那么后面的部分就由b、c来组成,之后再将b、c分别更换为头部,后面的就由剩下的字符来组成,而如果字符串中的字符比较多的时候,可以先从字符串的尾部开始排列,首先排列最后两个字符,交换后面两个字符,然后增加到三个字符,更换头部,排列剩下的部分,再依次增加到四个字符,更换头部,排雷剩下的部分......因此,这种思路可以用递归来实现:
#include <iostream> using namespace std; void PrintAllArray(char* str, char *p_start) { if(str != NULL)//判断参数有效性 { //当遍历到字符串结尾的时候就应当将字符串打印出来 if(*p_start == ‘\0‘) { cout<<str<<endl; return; } for(char *tmp = p_start; *tmp != ‘\0‘; ++tmp) { swap(*tmp, *p_start);//将当前头部更换为所有可能的字符 PrintAllArray(str, p_start+1);//进行递归排列 swap(*tmp, *p_start);//不能影响再次进行有序的交换,所以排列之后应当再将其交换回来 } } } int main() { char str[] = "abcd"; char* p_tmp = str; PrintAllArray(str, p_tmp); return 0; }
运行程序:
《完》
本文出自 “敲完代码好睡觉zzz” 博客,请务必保留此出处http://2627lounuo.blog.51cto.com/10696599/1785656
原文:http://2627lounuo.blog.51cto.com/10696599/1785656