难度:
简单
用到的知识点:
桶计数:其中的思想是需要有在这个范围内的同样数量的桶,接着把元素放到对应的桶中。
思路:
条件:
1. 一次遍历,必须保证此刻出现的字符前面没出现过。
2. 每一轮应该加入一个先升后降的序列,且保证上升序列和下降序列尽可能的长。
--------有了上面的两个限制条件我们可以根据限制条件重复操作,然后构造序列了-----
1. 先从未被选择的字符中提取出最长的上升字符串,将其加入答案。
2. 然后从未被选择的字符中提取出最长的下降字符串,将其加入答案。
因为字符的本身特性,所以我们只需要开一个26大小的数组模拟桶就可以
class Solution {
int k[26];
public:
string sortString(string s) {
for (char &c : s) {
k[c-'a']++;
}
string ans;
while (ans.length() < s.length()) {
for (int i = 0; i < 26; i++) {
if (k[i]) {
ans += 'a' + i;
k[i]--;
}
}
for (int i = 25; i >= 0; i--) {
if (k[i]) {
ans += 'a' + i;
k[i]--;
}
}
}
return ans;
}
};
战胜敌人,只是人生的赢家。
战胜自己,才是命运的强者。