题目描述
- 输入一个字符串,打印出该字符串中字符的所有排列
- 例如,输入字符串 abc,则打印出字符 a、b、c 所能排列出来的所有字符串 abc、acb、bac、bca、cab、cba
题目解读
- 剑指Offer 197
- 递归的思想,把一个字符串看成是由两部分组成:第一部分是它的第一个字符;第二部分是它的后面的所有字符。
- 第一步:求所有可能出现在第一个位置的所有字符,即把第一个字符和后面的所有字符交换
- 第二步:固定第一个字符,求后面所有字符的排列。这时候我们仍把后面的所有字符分为两部分:后面字符的第一个字符,以及这个字符之后的所有字符,然后把第一个字符逐个和它后面的字符交换
代码
#include<iostream>
using namespace std;
void swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
}
void percore(char *pstr, char *pbegin){
if(*pbegin == '\0'){
cout<<pstr<<endl;
}
else{
for(char *pch=pbegin; *pch != '\0'; pch++){
swap(pch, pbegin);
percore(pstr, pbegin+1);
swap(pch, pbegin);
}
}
}
void per(char str[]){
percore(str, str);
}
int main(){
char str[9] = "abc";
per(str);
return 0;
}
总结展望
网友评论