1. 程式人生 > 其它 >Leetcode 1370 題 上升下降字串

Leetcode 1370 題 上升下降字串

技術標籤:程式設計歷程Leetcode演算法java資料結構leetcode字串

題目來源:https://leetcode-cn.com/problems/increasing-decreasing-string/
個人公眾號:【小猿君的演算法筆記】

題目描述

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

  1. 從 s 中選出最小的字元,將它接在結果字串的後面。
  2. 從 s 剩餘字元中選出最小的字元,且該字元比上一個新增的字元大,將它接在結果字串後面。
  3. 重複步驟 2 ,直到你沒法從 s 中選擇字元。
  4. 從 s 中選出最大的字元,將它接在結果字串的後面。
  5. 從 s 剩餘字元中選出最大的字元,且該字元比上一個新增的字元小,將它接在
    結果字串後面。
  6. 重複步驟 5 ,直到你沒法從 s 中選擇字元。
  7. 重複步驟 1 到 6 ,直到 s 中所有字元都已經被選過。

示例:
輸入:s = “aaaabbbbcccc”
輸出:“abccbaabccba”

提示:
1 <= s.length <= 500
s 只包含小寫英文字母。


思路分析

這道題的題目描述很長,實際上就做兩件事,搜尋字元,按從小到大排序以及按從大到小排序。拿上面所給出的例子講解,先從小到大查詢到 abc,再從大到小查到 cba,依次從大到小和從小到大查詢,直到所有字元都被使用,最後將查到的結果拼接。

題目中給出 s 只包含小寫字母,因此,我們可以提供一個大小為 26 的陣列,用來儲存每個字母出現的次數。

從小到大以及從大到小遍歷陣列,找到出現次數大於 0 的字母即可。這裡的細節部分就不做過多描述,詳細可以檢視以下程式碼。


程式碼描述

使用 Java 進行程式碼描述:

class Solution {
    public String sortString(String s) {
        int [] count = new int[26]; // 用於儲存字母出現的次數
        int length = s.length();

        for (int i = 0; i < length; i++) { // 統計字母出現的次數
            count[s.
charAt(i) - 'a']++; } StringBuffer sb = new StringBuffer(); while (sb.length() < length) { for (int i = 0; i < 26; i++) { // 正序查詢 if (count[i] > 0) { sb.append((char) (i + 'a')); count[i]--; } } for (int i = 25; i >= 0; i--) { // 倒序查詢 if (count[i] > 0) { sb.append((char) (i + 'a')); count[i]--; } } } return sb.toString(); } }