題目:給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢? 輸出需要刪除的字元個數。
思路1.了解lcs演算法,具體實現的了解(1)把字串旋轉形成另外乙個字串,稱為旋轉字串;
(2)求原字串s1與旋轉字串s2中,最長公共子串的長度;
(3)刪除的字元數目 = 原字串的長度 - 最長公共子串的長度。
動態規劃 最長公共子串行 可以參考這篇文章,個人感覺真不錯
2.c++**剖析
#include
#include
#include
using
namespace
std;
const
int max = 1001;
int maxlen[max][max]; //最長公共子串行,動態規劃求法
int maxlen(string s1, string s2)
else
//不相同,maxlen[i][j] = max(maxlen[i - 1][j], maxlen[i][j - 1]);}}
return maxlen[length1][length2]; //因為本題只需要返回回文串的長度,如果需要,還可以獲取最長回文串
}int main()
//利用回文串的特點
string s2 = s;
reverse(s2.begin(),s2.end());
int max_length = maxlen(s, s2);
cout
<< length - max_length << endl; //要刪除的長度等於原本字串的長度-最長回文串的長度
}return
0;}
最長公共子串行LCS(動態規劃)
1.描述 給定兩個序列 x y 求x和y的乙個最長公共子串行。2.分析 設最長子序列 z 則 1 若 xm yn 則 zk xm yn,且z k 1 是 x m 1 和 y n 1 的最長公共子串行 2 若 xm yn 且 zk xm 則 z 是 x m 1 和 y 的最長公共子串行 3 若 xm ...
最長公共子串行(LCS) 動態規劃
首先,動態規劃的關鍵是將之前所計算的結果儲存起來,之後直接呼叫!1.問題描述 字串的子串行 是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行 是指多個字串可具有的長度最大的公共的子串行。比如 adbcbd bdcaba這兩個字串的最長公共子串行是dcb 2....
動態規劃 最長公共子串行(LCS)
最長公共子串行也是動態規劃中的乙個經典問題。有兩個字串 s1 和 s2,求乙個最長公共子串,即求字串 s3,它同時為 s1 和 s2 的子串,且要求它的長度最長,並確定這個長度。這個問題被我們稱為最長公共子串行問題。與求最長遞增子串行一樣,我們首先將原問題分割成一些子問題,我們用 dp i j 表示...