劍指offer——字串的排列
阿新 • • 發佈:2019-02-15
概述
題目描述
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
思路
這是一道典型回溯法的題目,類似於八皇后。利用dfs進行求解。由於可能出現重複字串,因此必須將中間結果存入集合後轉入vector中,最後進行排序。
C++ AC程式碼
#include <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<string> Permutation(string str) {
char* ch = (char*)str.c_str();
int len = str.length();
vector<string> ans;
set<string> s;
if(str == ""){
return ans;
}
dfs(s,str,len,0);
for(set<string>::iterator it = s.begin() ; it != s.end() ; it++){
ans.push_back(*it);
}
sort(ans.begin(),ans.end());
return ans;
}
void dfs(set<string>& s,string str,int len,int cnt){
if(cnt == len){
s.insert(str);
}else{
for(int i = cnt ; i < len ; i++){
char tmp = str[cnt];
str[cnt] =str[i];
str[i] = tmp;
dfs(s,str,len,cnt+1);
tmp = str[cnt];
str[cnt] =str[i];
str[i] = tmp;
}
}
}
};