LeetCode 1370 上公升下降字串

2021-10-10 22:13:32 字數 1602 閱讀 5620

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

從 s 中選出 最小 的字元,將它 接在 結果字串的後面。

從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。

重複步驟 2 ,直到你沒法從 s 中選擇字元。

從 s 中選出 最大 的字元,將它 接在 結果字串的後面。

從 s 剩餘字元中選出 最大 的字元,且該字元比上乙個新增的字元小,將它 接在 結果字串後面。

重複步驟 5 ,直到你沒法從 s 中選擇字元。

重複步驟 1 到 6 ,直到 s 中所有字元都已經被選過。

在任何一步中,如果最小或者最大字元不止乙個 ,你可以選擇其中任意乙個,並將其新增到結果字串。

請你返回將 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"

示例 3:

輸入:s = "leetcode"

輸出:"cdelotee"

示例 4:

輸入:s = "ggggggg"

輸出:"ggggggg"

示例 5:

輸入:s = "spo"

輸出:"ops"

1 <= s.length <= 500

s 只包含小寫英文本母。

通過次數38,608

提交次數48,366

思路:

每個字元被選擇且僅被選擇一次;每一輪會在字串末尾加入乙個先公升後降的字串,且該串的上公升部分和下降部分都會盡可能長。

重複若干輪下述操作,直到每乙個字元都被選擇過,這樣就可以構造出這個字串:先從未被選擇的字元中提取出最長的上公升字串,將其加入答案。

然後從未被選擇的字元中提取出最長的下降字串,將其加入答案。

注意到在構造時我們只關注字元本身,而不關注字元在原字串中的位置。因此我們可以直接建立乙個大小為26的桶,記錄每種字元的數量。每次提取最長的上公升或下降字串時,我們直接順序或逆序遍歷這個桶。

具體地,在遍歷桶的過程中,如果當前桶的計數值不為零,那麼將當前桶對應的字元加入到答案中,並將當前桶的計數值減一即可。我們重複這一過程,直到答案字串的長度與傳入的字串的長度相等。

class solution 

}for(int i=25;i>=0;i--)

}} while(flag);

return builder.tostring();

}}

LeetCode 1370 上公升下降字串

題目描述 給你乙個字串 s 請你根據下面的演算法重新構造字串 從 s 中選出 最小 的字元,將它 接在 結果字串的後面。從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。重複步驟 2 直到你沒法從 s 中選擇字元。從 s 中選出 最大 的字元,將它 接在 ...

LeetCode 1370 上公升下降字串

給你乙個字串 s 請你根據下面的演算法重新構造字串 從 s 中選出 最小 的字元,將它 接在 結果字串的後面。從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。重複步驟 2 直到你沒法從 s 中選擇字元。從 s 中選出 最大 的字元,將它 接在 結果字串的...

1370 上公升下降字串

題目描述 給你乙個字串 s 請你根據下面的演算法重新構造字串 從 s 中選出 最小 的字元,將它 接在 結果字串的後面。從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。重複步驟 2 直到你沒法從 s 中選擇字元。從 s 中選出 最大 的字元,將它 接在 ...