劍指offer:字串的全排列
阿新 • • 發佈:2019-01-21
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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; } } } } };