理解最短回文

2021-10-25 19:09:05 字數 1179 閱讀 7468

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串

示例1

輸入: "aacecaaa"

輸出: "aaacecaaa"

示例2

輸入: "abcd"

輸出: "dcbabcd"

找到從頭開始的最長回文串s[:i],在頭上加上s[i:]的翻轉即可

class solution(object):

def shortestpalindrome(self, s):

""":type s: str

:rtype: str

"""r = s[::-1]

for i in range(len(s) + 1):

if s.startswith(r[i:]):

return r[:i] + s

1. len(s)+1是為了匹配到空字串這種特殊情況;

2. startswith要完整的子串與s匹配;

3. 為什麼return r[:i] + s,因為r是顛倒過來的字串,為什麼要這樣寫呢?理由如下:

假設我們的字串是"abdea",我們可以在前面加個逆序之後的字串即為:"aedba|abdea",是不是很接近最短回文了,雖然它還不滿足回文,但是已經可以從中間往兩邊走了,有回文的那個味道了,但是怎麼樣才能滿足呢? 它一定滿足s逆序

+s中間

+s正序

s_+s_+s_

s逆序​+s

中間​+

s正序​

這種形式,其中s中間

s_s中

間​是由兩個相同子串組成,那麼我們找到這個相同子串並刪除其中乙個子串就得到回文了。"aedbaabdea"相同子串為"aa"那麼我們刪除其中乙個不就得到了回文"aedbaabdea"。再舉乙個例子 "aacecaaa",加逆序之後"aaacecaa|aacecaaa"相同子串"aacecaa",刪除之後得到回文"aaacecaaa"。

為什麼那麼中間的部分如何保證回文呢,很簡單,因為這一部分和逆序的部分已經相同,而且是逆序[i:]和正序[:i]相同,只有一種可能這一部分本身就是回文了。

最短回文串

給定乙個字串 s,你可以通過在字串前面新增字元將其轉換為回文串。找到並返回可以用這種方式轉換的最短回文串。示例 1 輸入 aacecaaa 輸出 aaacecaaa 示例 2 輸入 abcd 輸出 dcbabcd 解法1思路 因為是在前面加乙個最少的資料,我們先想最笨的辦法,就是在abcd前面加上a...

最短回文串 題解

最短回文串 palindrome.pas c cpp 如果乙個字串正過來讀和倒過來讀是一樣的,那麼這個字串就被稱作回文串。例如abcdcba,abcddbca就是回文串,而abcdabcd不是。你要解決的問題是 對於任意乙個字串,輸出將這個字串變為回文串需要插入的最少字元個數,比如,ab3bd只需要...

作業 最短回文串

最短回文串 palindrome.pas c cpp 如果乙個字串正過來讀和倒過來讀是一樣的,那麼這個字串就被稱作回文串。例如 abcdcba,abcddbca 就是回文串,而 abcdabcd 不是。你要解決的問題是 對於任意乙個字串,輸出將這個字串變為回文串需要插入的最 少字元個數,比如,ab3...