题目描述
编写一个方法,确定某字符串的所有排列组合。
给定一个string A和一个int n,代表字符串和其长度,请返回所有该字符串字符的排列,保证字符串长度小于等于11且字符串中字符均为大写英文字符,排列中的字符串按字典序从大到小排序。(不合并重复字符串)
测试样例:
“ABC”
返回:[“CBA”,”CAB”,”BCA”,”BAC”,”ACB”,”ABC”]
class Permutation {
public:
vector<string> res;
void perm(string list,int low,int high){
if(low==high){ //当low==high时,此时list就是其中一个排列,输出list
res.push_back(list);
}else{
for(int i=low;i<=high;i++){//每个元素与第一个元素交换
swap(list[i],list[low]);
perm(list,low+1,high); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i],list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
vector<string> getPermutation(string A) {
// write code here
perm(A,0,A.size()-1);
sort(res.begin(),res.end());
reverse(res.begin(),res.end());
return res;
}
};
class Permutation {
public:
vector<string> res;
void perm(string list,int low){
if(low == (list.size() - 1)){ //当low==high时,此时list就是其中一个排列,输出list
res.push_back(list);
}else{
for(int i = low;i < list.size();i++){//每个元素与第一个元素交换
swap(list[i],list[low]);
perm(list,low+1); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i],list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
vector<string> getPermutation(string A) {
// write code here
perm(A,0);
sort(res.rbegin(),res.rend());
return res;
}
};
下面STL库方法仅适用于不重复全排列,用于合并重复字符串情况,或者数多少种情况最合适,不适合于交换
详细请看http://blog.csdn.net/coolwriter/article/details/78861731
class Permutation {
public:
vector<string> getPermutation(string A) {
vector<string> res;
if(A.empty())
return res;
sort(A.begin(),A.end());
do{
res.push_back(A);
}
while(next_permutation(A.begin(),A.end()));
sort(res.begin(),res.end());
reverse(res.begin(),res.end());
return res;
}
};
结果
不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为75.00%
测试用例:
"NXX"
对应输出应该为:
["XXN","XXN","XNX","XNX","NXX","NXX"]
你的输出为:
["XXN","XNX","NXX"]
扩展数字全排列
#include <iostream>
using namespace std;
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void perm(int list[],int low,int high){
if(low==high){ //当low==high时,此时list就是其中一个排列,输出list
for(int i=0;i<=low;i++)
cout<<list[i];
cout<<endl;
}else{
for(int i=low;i<=high;i++){//每个元素与第一个元素交换
swap(list[i],list[low]);
perm(list,low+1,high); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i],list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
int main()
{
int list[]={1,2,3};
perm(list,0,2);
return 0;
}
相关题目
17. Letter Combinations of a Phone Number - coolwriter的博客 - CSDN博客
手机键盘字母
http://blog.csdn.net/coolwriter/article/details/79083998