题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
class Solution { public: vector<string> vs; vector<string> Permutation(string str) { //插排 int size = str.size(); if(size == 0) return vs; for(int i=1; i<size; ++i) { int j=i; while(str[j]<str[j-1] && j>=1) { char temp; str[j-1] = temp; str[j-1] = str[j]; str[j] = temp; --j; } } //全排列 perm(str, 0, size-1); return vs; } //改变字符位置,位置b的字符插入到位置a之前,保证插入后b之后的字符从小到大排列 void ins(string &str, int a, int b) { if(a == b) return; else { string temp = str.substr(b,1); str.erase(str.begin()+b); str.insert(a, temp); } } //全排列函数 void perm(string &str, int start, int end) { if(start>end) vs.push_back(str); else { for(int i=start; i<=end; ++i) { //相邻的重复元素不进行交换操作 if(!(str[start] == str[i] && start != i)) { string temp = str; ins(str, start, i);//原始的全排列这里是swap perm(str,start+1,end); str = temp; } } } } };