题目:输入一个字符串,打印该字符串的字符的所有排列。
全排列问题面试中经常看到,思想是开始取第一个字符,然后求后面字符的全排列。再分别将第一个字符与后面的字符交换,再全排列。代码如下:
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> vect;
vector<char> charVect;
if(str=="")
return vect;
Permutation(str,vect,0);
return vect;
}
void Permutation(string& str,vector<string>& vect,int begin)
{
if(begin==str.size())
{
vect.push_back(str);
return;
}
int j;
for(j=begin;j<str.size();j++)
{
swap(str[begin],str[j]);
Permutation(str,vect,begin+1);
swap(str[begin],str[j]);
}
}
};
结果发现这对于有重复字符的不成立。于是网上找,发现这篇大神文章。
http://blog.csdn.net/morewindows/article/details/7370155
对于有重复的字符,方法是,只要前面出现了该重复的字符,就不交换。
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> vect;
vector<char> charVect;
if(str=="")
return vect;
sort(str.begin(),str.end());
Permutation(str,vect,0);
return vect;
}
bool isDump(string str,int begin,int cur)
{
int i=0;
for(i=begin;i!=cur;i++)
if(str[i]==str[cur])
return false;
return true;
}
void Permutation(string str,vector<string>& vect,int begin)
{
if(begin==str.size())
{
vect.push_back(str);
return;
}
int j;
for(j=begin;j<str.size();j++)
{
if(isDump(str,begin,j))
{
swap(str[begin],str[j]);
Permutation(str,vect,begin+1);
swap(str[begin],str[j]);
}
}
}
};
当然,leecode上有大神这样写,但是我没看懂,求教。。
class Solution {
public:
void recursion(vector<int> num, int i, int j, vector<vector<int> > &res) {
if (i == j-1) {
res.push_back(num);
return;
}
for (int k = i; k < j; k++) {
if (i != k && num[i] == num[k]) continue;
swap(num[i], num[k]);
recursion(num, i+1, j, res);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(), num.end());
vector<vector<int> >res;
recursion(num, 0, num.size(), res);
return res;
}
};
意思我大概知道,就是后面的没交换回来我没懂。。。