求出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;
const int n = 5001;
int dp[2][n];
int getlsclength(int len, string s1, string s2) else }}
return dp[e][len];
}int main()
採用動態規劃,主要從兩端字元進行比較,dp[i][j]表示下標i到j的子串要成為回文串所需插入的字串的長度
如果 s[i] = s[j],那麼 dp[i][j] = dp[i+1][j-1]
否則,dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1,為什麼是dp[i+1][j]和dp[i][j-1]呢,因為每次發現頭尾不匹配時,這時在頭部或者尾部新增對應的卻掉的字元就可達到構造回文串的目的,對於這其中的每個子問題都是這樣的
**如下:
#include #include using namespace std;
const int max_size = 5005; //最大字串長度
short dp[max_size][max_size]; //dp[i][j]儲存字串[i, j]要插入的字元數,使用得其成為「回文」
int main()
}cout << dp[0][n-1] << endl;
return 0;
}
插入最少的字元使字串成為回文
今天和舍友聊到演算法題,他問了這道題,覺得挺有意思,故寫下解題思路。老久沒做演算法題了,偶爾搞搞還是挺有意思。給定乙個字串s,可以通過在字串的任意位置插入字元,使其變為回文串。求最少插入字元的數量。例如 ab bab 1 aa aa 0 abca acbca 1 如果能在原串s中找到最長的子串行l,...
插入最少字元使原串變成回文串
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 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字...