回文詞 題解

2021-10-25 18:13:04 字數 1408 閱讀 6713

題目描述

回文詞是一種對稱的字串——也就是說,乙個回文詞,從左到右讀和從右到左讀得到的結果是一樣的。任意給定乙個字串,通過插入若干字元,都可以變成乙個回文詞。你的任務是寫乙個程式,求出將給定字串變成回文詞所需插入的最少字元數。

比如字串「ab3bd」,在插入兩個字元後可以變成乙個回文詞(「dab3bad」或「adb3bda」)。然而,插入兩個以下的字元無法使它變成乙個回文詞。

輸入格式

第1行:1個整數n(3<=n<=5000),表示給定字串的長度

第2行:1個長度為n的字串。字串僅由大寫字母、小寫字母和數字構成。大、小寫字母不相同。字串中間不含任何其它字元。

輸出格式

第1行:1個整數,表示要變成回文數需要插入的最少字元數。

輸入樣例

5

ab3bd

輸出樣例

2
首先看回文串的性質

從前往後和從後往前讀出來是一樣的

比如:abba

那我們在想,如果讓我們去找要變成回文數需要插入的最少字元數,不就是讓我們找到原串中最長的那個回文串,然後需要改變的就是剩下的字元了

那我們可以很好的運用剛才的這個性質找到原串中的回文串:

只需要將原串取反,然後找兩串的最長公共子串行,就是原串中的回文串了。

那麼我們的問題就轉換為了找兩個字串的最長公共子串行;

設d p[

i][j

]dp[i][j]

dp[i][

j]表示第1

\text

1個字串走到了第i

\text

i個地方,第2

\text

2個字串走到了第j

\text

j個地方時,最長的子串行的長度是多少。

d p[

i][j

]=

dp[i - 1][j - 1] + 1& \text\\ max(dp[i - 1][j], dp[i][j - 1]) \end

dp[i][

j]=else

dp[i %2]

[j]=

max(dp[

(i -1)

%2][j]

, dp[i %2]

[j -1]

);//如果不相等的話再i比較j-1,i-1來比j}}

printf

("%d"

, n - dp[n %2]

[n])

;return0;

}完結撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。

模擬 回文詞

題目描述 回文詞是一種對稱的字串,也就是說 乙個回文詞,從左向右讀和從右向左讀的結果都是一樣的.任意給定乙個字串,通過插入若干個字元,都可以變成乙個回文詞.你的任務是寫乙個程式,求出給定字串變成回文詞所需插入的最小字元數.比如,字串 ab3db 在插入兩個字元後可以變成乙個回文詞 dab3bad a...

回文詞 C語言

題目描述 輸入乙個字串,判斷它是否為回文以及映象串。輸入字串保證不含數字0.所謂回文串,就是反轉之後原串相同,如abba和madam。所謂映象串,就是左右映象之後和原串相同,如2s和3aiae。注意,並不是每個字元在映象之後都能得到乙個合法字元,本題中,每個字元的映象如下所示,空白項表示該字元映象後...

回文詞 線性dp

include include using namespace std int n,f 5002 5002 char str1 5002 str2 5002 int main for int i 1 i n i if str1 i str2 j cout 題目描述 回文詞是一種對稱的字串 也就是說,...