学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。
附上汇总贴:洛谷刷题C++语言 | 汇总
【题目描述】
回文词是一种对称的字符串。任意给定一个字符串,通过插入若干字符,都可以变成回文词。此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数。
比如 Ab3bd 插入 2 个字符后可以变成回文词 dAb3bAd 或 Adb3bdA,但是插入少于 2 个的字符无法变成回文词。
注意:此问题区分大小写。
【输入】
输入共一行,一个字符串。
【输出】
有且只有一个整数,即最少插入字符数。
【输入样例】
Ab3bd
【输出样例】
2
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
string s1, s2;
int dp[N][N];
int main()
{
cin >> s2;
string s1 = s2;
reverse(s2.begin(), s2.end());
// cout << s1 << " " << s2;
s1 = " " + s1;
s2 = " " + s2;
int len = s1.size();
for (int i=1; i<=len; i++) {
for (int j=1; j<=len; j++) {
if (s1[i]==s2[j]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
cout << len - dp[len][len];
return 0;
}
【运行结果】
Ab3db
2