上升降低字符串


題目描述

給你一個字符串 s ,請你根據下面的算法從新構造字符串:java

  1. 從 s 中選出最小的字符,將它接在結果字符串的後面
  2. 從 s 剩餘字符中選出最小的字符,且該字符比上一個添加的字符大,將它接在結果字符串後面
  3. 重複步驟 2 ,直到你無法從 s 中選擇字符
  4. 從 s 中選出最大的字符,將它接在結果字符串的後面
  5. 從 s 剩餘字符中選出最大的字符,且該字符比上一個添加的字符小,將它接在結果字符串後面
  6. 重複步驟 5 ,直到你無法從 s 中選擇字符
  7. 重複步驟 1 到 6 ,直到 s 中全部字符都已經被選過

在任何一步中,若是最小或者最大字符不止一個 ,你能夠選擇其中任意一個,並將其添加到結果字符串。算法

請你返回將 s 中字符從新排序後的結果字符串app


解題思路

咱們能夠直接建立一個大小爲 26 的桶,記錄每種字符的數量。而後重複若干輪下述操做,直到答案字符串的長度與傳入的字符串的長度相等,這樣就能夠構造出這個字符串:ui

  1. 正序遍歷桶,從未被選擇的字符中提取出最長的上升字符串,將其加入答案,對應桶的計數減一
  2. 逆序遍歷桶,從未被選擇的字符中提取出最長的降低字符串,將其加入答案,對應桶的計數減一
class Solution {
    public String sortString(String s) {
        int[] nums = new int[26];
        for(int i = 0; i < s.length(); i++) {
            nums[s.charAt(i) - 'a']++;
        }
        StringBuilder sb = new StringBuilder();
        while(sb.length() < s.length()) {
            for(int i = 0; i < nums.length; i++) {
                if(nums[i] > 0) {
                    sb.append((char)(i + 'a'));
                    nums[i]--;
                }
            }
            for(int i = nums.length - 1; i >= 0; i--) {
                if(nums[i] > 0) {
                    sb.append((char)(i + 'a'));
                    nums[i]--;
                }
            }
        }
        return sb.toString();
    }
}
相關文章
相關標籤/搜索