45 Increasing Decreasing String

題目

Given a string s. You should re-order the string using the following algorithm:

Pick the smallest character from s and append it to the result.
Pick the smallest character from s which is greater than the last appended character to the result and append it.
Repeat step 2 until you cannot pick more characters.
Pick the largest character from s and append it to the result.
Pick the largest character from s which is smaller than the last appended character to the result and append it.
Repeat step 5 until you cannot pick more characters.
Repeat the steps from 1 to 6 until you pick all characters from s.

In each step, If the smallest or the largest character appears more than once you can choose any occurrence and append it to the result.

Return the result string after sorting s with this algorithm.

Example 1:

Input: s = “aaaabbbbcccc”
Output: “abccbaabccba”
Explanation: After steps 1, 2 and 3 of the first iteration, result = “abc”
After steps 4, 5 and 6 of the first iteration, result = “abccba”
First iteration is done. Now s = “aabbcc” and we go back to step 1
After steps 1, 2 and 3 of the second iteration, result = “abccbaabc”
After steps 4, 5 and 6 of the second iteration, result = “abccbaabccba”

Example 2:

Input: s = “rat”
Output: “art”
Explanation: The word “rat” becomes “art” after re-ordering it with the mentioned algorithm.

Example 3:

Input: s = “leetcode”
Output: “cdelotee”

Example 4:

Input: s = “ggggggg”
Output: “ggggggg”

Example 5:

Input: s = “spo”
Output: “ops”

Constraints:

1 <= s.length <= 500
s contains only lower-case English letters.

分析

題意:給定一個字符串,每次從中挑選比上一個小的字符加入結果集(第一次爲最小),直到沒有最小的爲止;然後再每次從中挑選比上一個大的字符加入結果集(第一次爲最大),直到沒有最大的爲止。

思路:一開始的想法是對字符串排序,然而,最多出現26個字母,而這26個字母的大小都是已知的。因此,可以這麼做.

1.構造一個26位的數組,數組下標表示對應字母,如a=0,z=25。
2.遍歷字符串,每出現一個字母,就讓數組對應位置++;
3.正向遍歷數組,將字母加到結果集,並讓該位置--;
4.反向遍歷數組,將字母加到結果集,並讓該位置--;
重複3-4,直到數組中的所有值爲0.

解答

class Solution {
    public String sortString(String s) {
        StringBuilder res = new StringBuilder();
        int[] tmp = new int[26];
        for(char c:s.toCharArray()){
            tmp[c-'a']++;
        }
        while(res.length()<s.length()){
            for(int i=0;i<26;++i){
                if(tmp[i]!=0){
                    res.append((char)(i+'a'));
                    tmp[i]--;
                }
            }
            for(int i=25;i>=0;--i){
                if(tmp[i]!=0){
                    res.append((char)(i+'a'));
                    tmp[i]--;
                }
            }
        }
        return res.toString();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章