題目連結(jié):
題目意譯:
給定一個(gè)字串 s。在一步之中你可以插入任何一個(gè)字元到該字串中的任意索引值上。
回傳將 s 變?yōu)檗捨淖钌偎璧牟襟E。
一個(gè)迴文字串代表著該字串從左至右讀與從右至左讀是一樣的。
限制:
1 ≦ s.length ≦ 500
s 由小寫(xiě)英文字母組成。
範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: s = "zzazz"
輸出: 0
解釋?zhuān)?字串 "zzazz" 已經(jīng)是迴文了,所以不需要插入任何字元。
範(fàn)例 2:
輸入: s = "mbadm"
輸出: 2
解釋?zhuān)?字串可以變成 "mbdadbm" 或是 "mdbabdm"。
範(fàn)例 3:
輸入: s = "leetcode"
輸出: 5
解釋?zhuān)?插入的 5 個(gè)字元會(huì)使字串變?yōu)?"leetcodocteel"。
解題思維:
可以看到如果把原本的 s 左右顛倒之後接在 s 的後面會(huì)形成一個(gè)迴文(當(dāng)然,這不一定是步驟最少的)。例如說(shuō),s = "leetcode",反轉(zhuǎn)之後加到原本的後面會(huì)是 "leetcode" + "edocteel"。
從上面的例子可以看到 s 中有些子序列左右顛倒之後還是長(zhǎng)一樣。例如說(shuō)上例中的 "ede" 就是一個(gè)這樣子的子序列。而這些子序列我們可以予以「保留」,也就是說(shuō)我們並不需要為這些子序列中的字元再新增多餘的「對(duì)應(yīng)字元」。
而這些子序列可以看做是 s 與自身左右顛倒後的字串取共同子序列(Common Subsequence)。而只要取出其中最長(zhǎng)的長(zhǎng)度,假設(shè)其長(zhǎng)度為 L,則所求為 s.length - L。
而最長(zhǎng)共同子序列(Longest Common Subsequence,LCS)的作法可以參見(jiàn)
這題。
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說(shuō)明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。