题目:
今天这道题上来我本来想的是双指针,但是后来觉得太过于麻烦,因为要来回遍历寻找,而且每次寻找的条件也不太一样,就弃了。
后来想到了哈希表,但是不知道怎么控制哈希表的选择顺序。
于是再然后,就想到了桶排序类似的方法。
答案的思路也很简单:
1.因为只有26个字母,所以直接建立一个大小为26的数组,遍历存储每一个字母的数量。
2.然后前后遍历整个数组,将剩余值大于0的值弹出并且压入答案字符串中。
C++代码附带测试:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Solution {
public:
string sortString(string s) {
vector<int> num(26);//直接创建26个桶来分组
for(char &ch :s)
{
num[ch-'a']++;//只有26个字母,分批存储
}
string ans;//返回的答案字符串
while(ans.length()<s.length())//长度相等的时候遍历结束
{
for(int i=0;i<26;i++)//正向遍历
{
if(num[i]!=0)
{
ans.push_back(i+'a');//压入当前字符
num[i]--; //存储个数减一
}
}
for(int i=25;i>=0;i--)//逆向遍历
{
if(num[i]!=0)
{
ans.push_back(i+'a');//压入当前字符
num[i]--; //存储个数减一
}
}
}
return ans;
}
};
int main()
{
string s = "aaaabbbbcccc";
Solution solution;
string ans = solution.sortString(s);
cout<<ans;
}