输入一个字符串,打印出该字符串的所有排列,例如输入字符串abc ,则打印出a,b,c 所能排列出来的所有字符串 abc,acd,bac,bca,cab,cba。
看似简单,其实不是很好做,应该把问题分解为子问题,我们把字符串看成两个部分,首字母自己作为一部分,后面的其他节点当做其它部分。可以看成两部走:
求出所有课程出现在第一位的字符 a和后面的bc交换。
第二步:固定第一个字符,求后面所有字符的排列。这个时候,第二步就抓换成一个子问题。
同时还应该注意重复字符串的问题 如: aa的排列只要一个就是 aa,而不是 aa,aa
下面是我用c++实现的代码
class Solution {
private:
vector<string>result;
void myPermutation(string str,int k){
if(k == str.size()-1){
result.push_back(str);
return;
}
for(int i =k;i< str.size();i++){
if(i !=k && str[i]==str[k]) continue;
swap(str[i],str[k]);
myPermutation(str,k+1);
}
}
public:
vector<string> Permutation(string str) {
if(str.size()<=0) return result;
sort(str.begin(),str.end());
myPermutation(str,0);
return result;
}
};