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;
}
下次遇到不會的,還是先看一些視頻感覺更直觀一點.