解題思路
第一步求所有可能出現在第一個位置的字符,即把第一個字符和後面的所有字符交換。
第二步固定第一個字符,求後面所有字符的排列。
這時候仍然把後面的所有字符分成兩部分:後面字符的第一個字符,以及這個字符之後的所有字符。然後把第一個字符逐一和它後面的字符交換。
舉例如下
以字符串"abc"爲例
對於重複結果的處理,我採用set進行解決
代碼
class Solution {
public:
vector<string> res;
set<string> tempRes;
vector<string> permutation(string s) {
if (s.size() == 0) return res;//字符串排列
solvePermutation(s, &s[0]);
for (set<string>::iterator it=tempRes.begin();it!=tempRes.end();it++)
{
res.push_back(*it);
}
return res;
}
void solvePermutation(string& s, char* sBegin)
{
//sBegin所指字符爲空'\0',將當前字符串s存儲起來
if (*sBegin == '\0') tempRes.insert(s);
else
{
//將字符串s中的字符從sBegin位置開始依次和當前字符串的首字符交換位置
for (char* sCh = sBegin; *sCh != '\0'; sCh++)
{
//交換位置
char temp = *sBegin;
*sBegin = *sCh;
*sCh = temp;
//交換完後繼續全排列
solvePermutation(s, sBegin + 1);
//回溯
temp = *sBegin;
*sBegin = *sCh;
*sCh = temp;
}
}
}
};