1. 题目
打印一个字符串的全部排列,要求不要出现重复的排列.比如给字符串abc, 那么需要我们输出abc,acb, bac, bca, cab,cba.
2. 思路
我们主要是借助递归思想.
- 将每个元素都与子数组的第一个元素交换
- 再求剩余部分的全排列
- 求完后再交换会来,复原原数组,这样是防止出现重复元素
一开始看网上的代码实在是不知所云,后来去网上找个视频,感觉不错.[算法教程] 全排列
3. 代码
#include <iostream>
void Swap(char* str, int i, int j) {
char temp = str[i];
str[i] = str[j];
str[j] = temp;
};
void PrintAllPermutations(char* str, int start, int end) {
if (start == end) {
for (int i = 0; i <= end; ++i) {
std::cout << str[i];
}
std::cout << "\n";
} else {
for (int i = start; i <=end; ++i) {
Swap(str, start, i);
PrintAllPermutations(str, start + 1, end);
Swap(str, start, i);
}
}
}
int main()
{
std::string res = "abcd";
PrintAllPermutations((char*)res.c_str(), 0, res.size() - 1);
return 0;
}
下次遇到不会的,还是先看一些视频感觉更直观一点.