剑指offer--代码题目4--字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:使用STL里的next_permutation(数组头地址,数组尾地址);若下一个排列存在,则返回真,如果不存在则返回假。
next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。
记得头文件是:#include <algorithm>
#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
public:
//简短的AC代码。调用了STL的next_permutation函数
vector<string> Permutation(string str) {
vector<string> answer;
if(str.empty())
return answer;
sort(str.begin(),str.end());
do{
answer.push_back(str);
}
while(next_permutation(str.begin(),str.end()));//不断生成下一个排列
return answer;
}
int main()
{
vector<string> vec1;
Solution sa;
string str1 = "abc";
vec1 = sa.Permutation(str1);
int size1 = vec1.size();
for(int i = 0; i < size1;i++)
{
cout << vec1[i] << endl;
}
return 0;
}
结果如下:
还有书上的一种方法,代码如下:
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();
}
}
};