今天和舍友聊到演算法題,他問了這道題,覺得挺有意思,故寫下解題思路。老久沒做演算法題了,偶爾搞搞還是挺有意思。給定乙個字串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 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字...