前往
大廳
主題

LeetCode - 1312. Minimum Insertion Steps to Make a String Palindrome 解題心得

Not In My Back Yard | 2024-03-03 12:00:10 | 巴幣 0 | 人氣 48

題目連結:


題目意譯:
給定一個字串 s。在一步之中你可以插入任何一個字元到該字串中的任意索引值上。

回傳將 s 變為迴文最少所需的步驟。

一個迴文字串代表著該字串從左至右讀與從右至左讀是一樣的。

限制:
1 ≦ s.length ≦ 500
s 由小寫英文字母組成。



範例測資:
範例 1:
輸入: s = "zzazz"
輸出: 0
解釋: 字串 "zzazz" 已經是迴文了,所以不需要插入任何字元。

範例 2:
輸入: s = "mbadm"
輸出: 2
解釋: 字串可以變成 "mbdadbm" 或是 "mdbabdm"。

範例 3:
輸入: s = "leetcode"
輸出: 5
解釋: 插入的 5 個字元會使字串變為 "leetcodocteel"。


解題思維:
可以看到如果把原本的 s 左右顛倒之後接在 s 的後面會形成一個迴文(當然,這不一定是步驟最少的)。例如說,s = "leetcode",反轉之後加到原本的後面會是 "leetcode" + "edocteel"。

從上面的例子可以看到 s 中有些子序列左右顛倒之後還是長一樣。例如說上例中的 "ede" 就是一個這樣子的子序列。而這些子序列我們可以予以「保留」,也就是說我們並不需要為這些子序列中的字元再新增多餘的「對應字元」。

而這些子序列可以看做是 s 與自身左右顛倒後的字串取共同子序列(Common Subsequence)。而只要取出其中最長的長度,假設其長度為 L,則所求為 s.length - L。

而最長共同子序列(Longest Common Subsequence,LCS)的作法可以參見這題




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

創作回應

更多創作