这题就是经典DFS排列(Permutation)题。
注意:
1)既然是Permutation,就要先sort,并加visited[]。而input是个string,所以要把string变成vector< char >才能sort。
2) 注意去重的关键一步。
if ((i > 0) && (str[i] == str[i - 1]) && !visited[i-1]) continue;
这个实际上是
if ((i > 0) && (str[i] == str[i - 1]) &&visited[i] && !visited[i-1]) continue;
表示相同元素的后面一个元素选在了前面元素之前。但我们前面已经排除了visited[i],所以这里不用再加了。
代码如下:
class Solution {
public:
/**
* @param str: A string
* @return: all permutations
*/
vector<string> stringPermutation2(string &str) {
vector<string> results;
string sol;
if (str.empty()) {
results.push_back("");
return results;
}
int strSize = str.size();
vector<char> inputStr(strSize);
for (int i = 0; i < strSize; ++i) {
inputStr[i] = str[i];
}
sort(inputStr.begin(), inputStr.end());
vector<bool> visited(strSize, false);
helper(inputStr, 0, visited, sol, results);
return results;
}
void helper(vector<char> &str, int index, vector<bool> &visited, string &sol, vector<string> &results) {
int strSize = str.size();
if (sol.size() == strSize) {
results.push_back(sol);
return;
}
for (int i = 0; i < strSize; ++i) {
if (visited[i]) continue;
if ((i > 0) && (str[i] == str[i - 1]) && !visited[i-1]) continue;
sol.push_back(str[i]);
visited[i] = true;
helper(str, index + 1, visited, sol, results);
visited[i] = false;
sol.pop_back();
}
}
};