最短回文串(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 思...