LeetCode 🟡 3106. Lexicographically Smallest String After Operations With Constraint
🔗 🟡 3106. Lexicographically Smallest String After Operations With Constraint 1515
tags: Weekly Contest 392
貪心(Greedy)
字串(String)
題意
給定一個字串 和一個整數 。
定義兩個長度相同為 的字串 和 之間的距離 為:
- 將字元
'a'
到'z'
視為按 循環 順序排列。 - 對於區間 中的 ,計算所有「 和 之間 最小距離 」的 和 。
例如, ,且 。
你可以對字串 進行 任意次 操作。在每次操作中,可以將 中的一個字母 改變 為 任意 其他小寫英文字母。
返回一個字串 ,表示在執行一些操作後,你可以得到的 字典序最小 的字串,且滿足 。
約束條件
思路:貪心(Greedy)
這個問題的關鍵在於找到一個字典序最小的字串 ,使得 與給定字串 的距離不超過 。我們可以採用 貪心(Greedy) 策略來解決這個問題。具體來說,我們的目標是盡可能地將 中的字元改變為 ,因為 是字典序最小的字元。
而將 中的非 的字元改變為 ,會增加 和 的距離,但根據題意,距離不能超過 。
- 因此同樣基於貪心的思路,我們可以優先修改 中前面的字元,直到增加的距離會超過 為止。
- 當能夠修改的距離不足以修改為 時,則需要往前修改 個字元。
具體步驟如下:
- 遍歷字串 :從頭到尾遍歷字串 ,對於每一個字元 ,計算將其改變為 ‘a’ 所需的距離 。
- 計算距離 :這裡的距離 是指將 改變為 ‘a’ 所需的步數。由於字元是循環排列的,我們需要考慮兩種情況:
- 從 到 ‘a’ 的直接距離。
- 從 到 ‘z’ 再到 ‘a’ 的距離(即循環距離)。
我們取這兩種情況中的最小值作為 。
- 檢查剩餘額度 :如果 大於剩餘的額度 ,則表示我們無法將 改變為 ‘a’。此時,我們需要將 改變為一個能夠滿足剩餘額度 的字元,然後結束循環。
- 更新字串 和剩餘額度 :如果 小於等於 ,則將 改變為 ‘a’,並更新剩餘額度 。
複雜度分析
- 時間複雜度:,其中 是字串 的長度。我們只需要遍歷一次字串 。
- 空間複雜度: 或 ,取決於能不能直接改變字串 。
1 | class Solution: |
1 | class Solution { |
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus