剑指OFFER题31------按牛客网热度排序
时间:2018.12.11.2112
作者:Waitt
题目
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
时间限制:1秒 空间限制:32768K 热度指数:285259
解答
求字符串的排列:
- 求出所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换。
- 固定第一个字符,求后面所有字符的排序。
- 此时仍把后面的字符看成两部分,第一个字符和后面的字符,然后重复上述步骤。
解题步骤:
- 无论是否有重复数字,均先对原字符串进行排序,使其变为字典序。
- 按字符串排列解法进行求解。
class Solution {
public:
void paixu(vector<string> &a,int k,string str)
{
if(k==str.size()-1)
a.push_back(str);
for(int i=k;i<str.size();i++)
{
if(i!=k&&str[i]==str[k])
continue;
swap(str[i],str[k]);//每次将str的k位与i位进行交换后,便以保证后字符串位字典序,因此无须再将其交换回来。
paixu(a,k+1,str);
//若在此处将str的k位与i位交换回来,则后字符串便不是字典序,而且可能出现重复结果
}
}
vector<string> Permutation(string str) {
vector<string> a;
if(str.empty())
return a;
int n=str.size();
for(int i=0;i<n;i++) //冒泡排序,用sort()排序也行。保证str为字典序。
{
for(int j=n-1;j>i;j--)
{
if(str[j]<str[j-1])
{
char t=str[j];
str[j]=str[j-1];
str[j-1]=t;
}
}
}
int k=0;
paixu(a,k,str);//进行迭代
return a;
}
};