Leetcode 1370 題 上升下降字串
阿新 • • 發佈:2020-12-23
技術標籤:程式設計歷程Leetcode演算法java資料結構leetcode字串
題目來源:https://leetcode-cn.com/problems/increasing-decreasing-string/
個人公眾號:【小猿君的演算法筆記】
題目描述
給你一個字串 s ,請你根據下面的演算法重新構造字串:
- 從 s 中選出最小的字元,將它接在結果字串的後面。
- 從 s 剩餘字元中選出最小的字元,且該字元比上一個新增的字元大,將它接在結果字串後面。
- 重複步驟 2 ,直到你沒法從 s 中選擇字元。
- 從 s 中選出最大的字元,將它接在結果字串的後面。
- 從 s 剩餘字元中選出最大的字元,且該字元比上一個新增的字元小,將它接在
- 重複步驟 5 ,直到你沒法從 s 中選擇字元。
- 重複步驟 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();
}
}