插入最少的字元使字串成為回文

2021-09-30 10:22:29 字數 829 閱讀 9562

今天和舍友聊到演算法題,他問了這道題,覺得挺有意思,故寫下解題思路。老久沒做演算法題了,偶爾搞搞還是挺有意思。
給定乙個字串s,可以通過在字串的任意位置插入字元,使其變為回文串。求最少插入字元的數量。

例如:ab -> bab  1

aa -> aa    0

abca -> acbca 1

如果能在原串s中找到最長的子串行l,這個子串行是回文,那麼我們就能知道要插入多少個字元是的原串成為回文。

ans = strlen(s) - strlen(l)

問題轉為求乙個字串的最長回文子串行,這個問題可以使用最長公共子串行的解法,解法如下:

1.求s的逆序串 s',;

2.那麼s和s'的用求最長公共子串行l,l即為s的最長回文子串行(這個規律是在推演中發現的);

3.那麼問題得解:

ans = strlen(s) - strlen(l)。

例如: s = abca 那麼 s' = acba ,那麼l = aba 那麼答案就是1.即 a』c『bca。其中'c'為插入的字元。

該演算法的核心是求最長公共子串行,

最長公共子串行有dp的求法,演算法的複雜度是 時間和空間都是 o(n^2)

原作者提供

主要採用動態規劃,動態規劃主要從兩端字元進行比較,因而有重複子問題。

假設將問題表示為公式s(0,n-1),那麼

if(a[0] = a[n-1]) 

s(0,n-1) == s(2,n-2) 

else 

s(0,n-1) == min( s(1,n-2) , s(2,n-1) ) + 1

其中a[i]為串s中的第i個字元。

插入最少的字元使字串成為回文串

求出s中,是回文的最長子序列l,那麼結果ans length s length l 解法如下 1.求出s的逆序串s 2.求出s和s 的最長公共子串行l 3.ans length s length l 如下 include include include using namespace std con...

插入最少字元使原串變成回文串

51nod1092 回文字串 解法一 這裡插入字元和刪除對應字元是乙個道理,所以將原串逆序之後求一遍lcs即可 include using namespace std const int maxn 1000 char a maxn 10 char b maxn 10 int sum maxn 10 ...

演算法題 源字串插入最少字元生成回文串

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字...