最短回文串 題解

2021-04-30 04:40:45 字數 1110 閱讀 4924

最短回文串(palindrome.pas/c/cpp)

如果乙個字串正過來讀和倒過來讀是一樣的,那麼這個字串就被稱作回文串。例如abcdcba,abcddbca就是回文串,而abcdabcd不是。

你要解決的問題是:對於任意乙個字串,輸出將這個字串變為回文串需要插入的最少字元個數,比如,ab3bd只需要插入2個字元就可以變為乙個回文串。

輸入資料

第一行是乙個整數n

第二行是乙個長度為n字串s

輸出資料

一行乙個整數,表示將s變為回文串需要插入的最小字元個數

樣例輸入與輸出

ab3bd

2 資料範圍

對於所有資料,0有兩種方法:    方法一: 若a形如?a'?,(問號代表任意乙個相同字元,下同)則只需將a'變為回文串。

若a形如?a'或者a'?,則只需將a'變為回文串,再在a的後面或者前面插入乙個」?」

定義狀態f[i,j]為將ai..aj變為回文串的最小代價,則

f[i][j]=    f[i+1][j-1] (若ai=aj)

min(f[i+1][j],f[i][j-1])+1 (若ai<>aj)

一共有n2個狀態,狀態轉移是o(1)的,總的複雜度為o(n2)

方法二:

另一種方法是將原串與原串的倒序做一次lcs,用原串長度減去lcs長度,即為需要插入字元的個數。

lcs即為最長公共子串行:

n用c[i,j]表示x[1..i]和y[1..j]的最長公共子串行的長度。

n          0                                  i=0或j=0

c[i,j]=  c[i-1,j-1]+1                i,j>0且x[i]=y[j]

max i,j>0且x[i]≠y[j]

n觀察上式發現,為了求c[i,j],需要預先知道c[i-1,j-1]、c[i-1,j]和c[i,j-1]。所以可以先從小到大列舉i,再從小到大列舉j。

n最長公共子串行的長度就是c[m,n]。 

還有方法三 是來自復旦附中,進入清華的李魯魯同學提供的:用kmp匹配,複雜度o(n),可惜我不會.......

c:方法一 

pascal:方法二:

最短回文串

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

作業 最短回文串

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

214 最短回文串

難度 困難 題目描述 思路總結 python字串反轉幾種方法 還是那句話,現階段注重的是數量,質量等後期提高。這題利用簡單的直覺做題,這種思路還需要再積累。沒見過這種題是很難想出來的。題解一 class solution def shortestpalindrome self,s str str 思...