1. 程式人生 > >劍指offer——字串的排列

劍指offer——字串的排列

概述

題目描述
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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; } } } };