求字符串全排列
Q:输入一个字符串,打印出该字符串中字符的所有排列
A:以abc为例,我们首先将a固定在第一位,然后排列bc,当bc排列完成后,我们会将b固定在第一位,也就是交换a和b的位置,变成bac,然后排列ac,当ac排列完成后,我们需要将c固定在第一位,先将a和b的位置复原,在交换a和c的位置即可。因此,用递归来求解再自然不过。对于字符串abcdedfgh….,在以begin为开头的子串中,我们要依次将子串的每一个字符固定在首位,这需要依次swap操作,然后我们递归的处理子串开头之后的更小子串的排列,当处理好之后,我们回到该子串,再将刚才的swap操作重新操作一遍。
#include <iostream> using namespace std; void Arrange(char* str,char* begin) { if(!str || !begin) return; if(*begin=='\0') cout <<str<<endl; else { for(char* p=begin;(*p)!='\0';++p) { char temp=*p; *p=*begin; *begin=temp; Arrange(str,begin+1); temp=*p; *p=*begin; *begin=temp; } } } int main() { char str[50]; while(cin >>str) Arrange(str,str); return 0; }