字符串的排列
题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
a:把字符串分为两部分:第一部分是第一个字符,第二部分是第一个字符以后的部分,然后拿第二个字符和第一个字符分别进行交换;
b:求出所有可能出现在第一部分的字符,然后进行a的操作。
下面的代码是我在牛客网的oj环境下编译通过的
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> a;
if(str.empty())
return a;
Permutation(a,str,0);
sort(a.begin(),a.end());//按照字典序输出,sort是对给定区间元素进行排序
return a;
}
void Permutation(vector<string> &array, string str, int begin)//遍历第begin位的所有可能性
{
//一次遍历的结束条件
if(begin == str.size()-1)
{
array.push_back(str);
}
for(int i=begin;i<str.size();i++)
{
if(i!=begin && str[i] == str[begin])
{
continue;//有与begin位重复的字符串不进行交换,跳过
}
swap(str[i],str[begin]);
//当i==begin时,也要遍历其后面的所有字符
//当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符
Permutation(array,str,begin+1);
swap(str[i],str[begin]);//为了防止重复的情况,还需要将begin处的元素重新换回来
}
}
};