給定乙個字串 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...