1370. 上升下降字符串 - 力扣(LeetCode)
题目有点难读懂,大体意思就是先升序再降序来回走,可以使用桶排序的思路:把不同的字母放在不同的桶里面,相同的字母放在同一个桶里面。假设桶为a--z
,先从a
桶出发,如果桶里面有元素,就取出一个(追加到res),一直走到z
桶,此时又从z
桶出发,向a
桶的方向走,如此来回反复即可。
class Solution {
public:
int count[26];
string sortString(string s) {
for(const auto &c : s) ++count[c-'a'];//桶排序的思路(计数)
string res;
while(res.size() < s.size()){
for(int i = 0; i < 26; ++i){//升序走一遍
if(count[i] > 0){
res += i+'a';
--count[i];
}
}
for(int i = 25; i >= 0; --i){//降序走一遍
if(count[i] > 0){
res += i+'a';
--count[i];
}
}
}
return res;
}
};
也可以原地操作:
class Solution {
public:
int count[26];
string sortString(string s) {
for(const auto &c : s) ++count[c-'a'];//桶排序的思路(计数)
int cnt = 0;
while(cnt < s.size()){
for(int i = 0; i < 26; ++i){//升序走一遍
if(count[i] > 0){
s[cnt++] = i+'a';
--count[i];
}
}
for(int i = 25; i >= 0; --i){//降序走一遍
if(count[i] > 0){
s[cnt++] = i+'a';
--count[i];
}
}
}
return s;
}
};