前往
大廳
主題

LeetCode - 1750. Minimum Length of String After Deleting Similar Ends 解題心得

Not In My Back Yard | 2024-05-15 12:00:10 | 巴幣 0 | 人氣 32

題目連結:


題目意譯:
給定一個只由字元 'a' 、 'b' 和 'c' 的字串 s。現在你被要求執行若干次以下的演算法到 s 上:
    1. 從字串 s 中選擇一個非空前綴,其中該前綴中所有字元相同。
    2. 從字串 s 中選擇一個非空後綴,其中該後綴中所有字元相同。
    3. 選定的前綴和後綴不應重疊。
    4. 前綴和後綴中的字元應相同。
    5. 同時從 s 中刪除選定的前綴以及後綴。

回傳執行若干次(可能為零次)演算法之後,s 的最小長度。

限制:
1 ≦ s.length ≦ 10 ^ 5
s 只由字元 'a' 、 'b' 和 'c' 所組成。



範例測資:
範例 1:
輸入: s = "ca"
輸出: 2
解釋: 你無法移除任何字元,因此該字串會維持原狀。

範例 2:
輸入: s = "cabaabac"
輸出: 0
解釋: 一個最佳操作序列為:
- 取前綴 = "c" 且後綴 = "c" 並移除它們,s = "abaaba"。
- 取前綴 = "a" 且後綴 = "a" 並移除它們,s = "baab"。
- 取前綴 = "b" 且後綴 = "b" 並移除它們,s = "aa"。
- 取前綴 = "a" 且後綴 = "a" 並移除它們,s = ""。

範例 3:
輸入: s = "aabccabba"
輸出: 3
解釋: 一個最佳操作序列為:
- 取前綴 = "aa" 且後綴 = "a" 並移除它們,s = "bccabb"。
- 取前綴 = "b" 且後綴 = "bb" 並移除它們,s = "cca"。


解題思維:
可以看到每當 s 的開頭字元和結尾字元一樣時,我們應當要讓前綴和後綴取得盡可能越長越好。

例如說,s = "aabccaaaa",此時你應取前綴 = "aa" 、 後綴 = "aaaa"。而不是前綴 = "a" 或後綴 = "aa" 等。

因為如果消掉之後,新的開頭(或結尾)字元還跟原本的一樣的話,那包進去前一次的刪除當然也沒有問題;而另一方面,如果前綴或後綴沒有刪「乾淨」,則可能會出現開頭(或結尾)已經出現了與先前不同的新字元而另一端還依舊是原先的字元。那還不如一口氣把相同的字元刪光光,把兩端的新字元暴露出來。

重複以上步驟直到刪光光或是 s 的長度剩 1(此時前綴和後綴的字元雖然一樣,但是一定會重疊,所以刪不掉)。此時的 s 長度即為所求最小長度。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作