前往
大廳
主題

LeetCode - 1328. Break a Palindrome 解題心得

Not In My Back Yard | 2022-03-09 00:00:09 | 巴幣 0 | 人氣 169

題目連結:


題目意譯:
給定一個小寫英文字母迴文字串 palindrome,以任何小寫英文字母替換掉恰好一個字元使得結果字串不是一個迴文且其字典序盡可能地小。

回傳結果字串。如果沒有任何方式可以替換一字元使該字串變為非迴文,則回傳一個空字串。

一個字串 a 字典序小於一字串 b(長度相同),如果 a 和 b 第一個差異的地方,其中 a 有著一字元嚴格小於 b 的對應字元。例如,"abcc" 字典序小於 "abcd" 因為第一個兩者相異的位置為第四個字元,而 'c' 小於 'd'。

限制:
1 ≦ palindrome.length ≦ 1000
palindrome 只由小寫英文字母組成。



範例測資:
範例 1:
輸入: palindrome = "abccba"
輸出: "aaccba"
解釋: 有許多方式可以使 "abccba" 變得不是迴文,例如 "zbccba" 、 "aaccba" 和 "abacba"。
在這些方式中,"aaccba" 字典序是最小者。

範例 2:
輸入: palindrome = "a"
輸出: ""
解釋: 沒有任何方式可以替換單個字元使 "a" 變為不是迴文,所以回傳一個空字串。


解題思維:
可以看到當給定的字串 palindrome 的長度 > 1 時,我們可以替換任一一個字元為其他的字元使其變為非迴文。反過來說也就是只有當 palindrome 長度為 1 時,不論我們怎麼替換字母都會是迴文(因為長度只有 1)。因此當 palindrome 長度為 1 時,我們可以直接回傳 ""。

如果長度 > 1,則我們把 palindrome 從左掃到右去找到第一個不是字母 'a' 的字母。如果找得到的話(也就是 palindrome 不是 "aa……aa"),則我們可以將該位置的字母換成 'a',則我們便可以得到一個字典序最小的非迴文。原因是因為我們比較字典序的時候是由左往右比第一個不同的字母之大小,因此要使字典序盡可能小就代表我們應當使不同的字母越早出現越好,而且該字母越小越好。

而如果 palindrome 為 "aa……aa" 的話,則我們只需將最後一個字母改為 'b' 即可,即 "aa……ab"。




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

創作回應

更多創作