題目**,
原題給定字串,可以通過插入字元,使其變為回文。求最少插入字元的數量。例如:
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 ...