题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
分析:我的思路是为了保证字典序,需要先把输入的字符串排序,然后固定第一个字符,把剩下的字符串全排列,这样如果出现重复的字符,需要判定得到的字符串是不是重复,所以写了个重复函数,代码复杂度不高,但是没有优化,比如排列之后,如果出现重复的字符是可以直接跳过的,所以没必要判定重复。剑指offer上的思想是:第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换;第二步固定第一个字符,求后面所有字符的全排列。
我的代码:
class Solution {
public:
string res;
vector<string> result;
vector<string> Permutation(string str) {
if(!str.length())
return result;
sort(str.begin(),str.end());
permu(str);
return result;
}
void permu(string str){
int size = str.length();
if(size==0){
if(IsRepeat(res))
result.push_back(res);
}
for(int i=0;i<size;i++){
string s(str);
res.push_back(s[i]);
s.erase(i,1);
permu(s);
res.pop_back();
s.~string();
}
}
bool IsRepeat(string s){
if(result.empty())
return true;
for(int i=0;i<result.size();i++){
if(result[i]==s)
return false;
}
return true;
}
};
public:
string res;
vector<string> result;
vector<string> Permutation(string str) {
if(!str.length())
return result;
sort(str.begin(),str.end());
permu(str);
return result;
}
void permu(string str){
int size = str.length();
if(size==0){
if(IsRepeat(res))
result.push_back(res);
}
for(int i=0;i<size;i++){
string s(str);
res.push_back(s[i]);
s.erase(i,1);
permu(s);
res.pop_back();
s.~string();
}
}
bool IsRepeat(string s){
if(result.empty())
return true;
for(int i=0;i<result.size();i++){
if(result[i]==s)
return false;
}
return true;
}
};
剑指offer的思路:他没有排序,加个sort函数就好
链接:
https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7
来源:牛客网
来源:牛客网
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//参照剑指offer的思路
class
Solution {
public
:
vector<string> Permutation(string str) {
vector<string> res;
if
(str.empty())
return
res;
string tmp=
""
;
recur(str,res,tmp,0);
return
res;
}
void
recur(string str,vector<string> &res,string &tmp,
int
start){
if
(start==str.size()){
res.push_back(tmp);
return
;
}
for
(
int
i=start;i<str.size();i++){
//判断要交换的字符是否相同,相同就不用交换直接跳过(除了start位置与自己交换的情况)
if
(i!=start&&str[start]==str[i])
continue
;
swap(str[start],str[i]);
tmp+=str[start];
recur(str,res,tmp,start+1);
tmp.pop_back();
}
}
};
|