題目連結:
題目意譯:
你被給定一字串 s。使用以下演算法將字串重新排序字串:
(注:原題敘沒有將下列步驟編號,在此補上以幫助理解)
1. 將 s 中最小的字元挑出來並放到結果字串的尾端。
2. 將 s 中最小的字元,其中該字元大於上一個挑的字元,挑出來後並放到結果字串的尾端。
3. 重複步驟 2 直到你不能再挑任何字元。
4. 將 s 中最大的字元挑出來並放到結果字串的尾端。
5. 將 s 中最大的字元,其中該字元小於上一個挑的字元,挑出來後並放到結果字串的尾端。
6. 重複步驟 5 直到你不能再挑任何字元。
7. 重複步驟 1 到 6 直到你把 s 中所有字元挑走為止。
在每一步之中,如果最小或最大字元出現多於一次,則你可以選擇任一者並放到結果字串的尾端。
回傳將 s 按照演算法排序後的結果字串。
限制:
1 ≦ s.length ≦ 500
s 只由小寫英文字母組成。
範例測資:
範例 1:
輸入: s = "aaaabbbbcccc"
輸出: "abccbaabccba"
解釋: 第一次疊代中,在第 1 、 2 和 3 步後,result = "abc"
第一次疊代中,在第 4 、 5 和 6 步後,result = "abccba"
第一次疊代就此結束。現在 s = "aabbcc,而我們重新回到第 1 步。
第二次疊代中,在第 1 、 2 和 3 步後,result = "abccbaabc"
第二次疊代中,在第 4 、 5 和 6 步後,result = "abccbaabccba"
範例 2:
輸入: s = "rat"
輸出: "art"
解釋: 利用提及的演算法重新排列後的字詞 "rat" 將變成 "art"。
解題思維:
首先把 s 中每一種字元的出現次數統計出來,存在一陣列之中。
然後我們可以看到步驟 1 ~ 3 其實就等價從字元 'a' 掃到字元 'z',然後看哪些字元有出現在 s 中,並將其加到結果字串的尾端(記得在統計次數的陣列中將對應字元的次數減 1)。
而步驟 4 ~ 6 也是類似的情況,只是是從 'z' 掃到 'a'。
因此我們只要重複以上步驟直到結果字串的長度等於 s 原先的長度即可(代表此時已經把 s 中的字母挑光了)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。