最少插入字元分析

2021-06-22 17:11:44 字數 812 閱讀 7124

題目**,

原題給定字串,可以通過插入字元,使其變為回文。求最少插入字元的數量。例如:

1.

ab最少插入

1個字元,變為*b*

ab2.

aa最少插入

0個字元

3.abcd

最少插入

3個字元,*

dcb*

abcd

分析:根據回文串的定義,很容易獲得遞迴思路,首先比較第乙個和最後乙個字元,相等則插入個數等於中間的插入個數,不等,則可以通過在開頭或最後新增乙個字元,使得兩頭相等,比如abcd可以轉化為abcda或dabcd,這樣,遞迴方程為:當str[i]==str[j]時,fun(i,j)=fun(i+1,j-1);否則fun(i,j)=min(fun(i+1,j),fun(i,j-1))+1.容易看出,該遞迴具有重複子序列,加上題目要求最短,故有最優的含義,故可轉化為動態規劃,動態規劃的轉移方程一般和遞迴方程一樣,只是求解時需要利用先前的結果。本題中,可以看出求解方向是從兩頭向內部,和回文串的判斷一樣,動態規劃的思路是先求len=1,然後len=2,然後……,故可得如下**:

int mininsertchar(char* src)

for(len=1;len=1;i--)//從後向前

}int res = dp[1][length];

for(i=0;i<=length;i++)delete dp[i];

delete dp;

return res;

}

本**只代表個人觀點,如有錯誤,請指正,謝謝

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

今天和舍友聊到演算法題,他問了這道題,覺得挺有意思,故寫下解題思路。老久沒做演算法題了,偶爾搞搞還是挺有意思。給定乙個字串s,可以通過在字串的任意位置插入字元,使其變為回文串。求最少插入字元的數量。例如 ab bab 1 aa aa 0 abca acbca 1 如果能在原串s中找到最長的子串行l,...

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

求出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 ...