首页 🐶算法

题目

0

思路

因为回文串正着反着都一样所以,这题可以再弄一个输入字符串翻转的字符串,然后求最长公共子序列。

比如字符串Ab3bd与db3bA的最长公共子序列为b3b,多出来的就是Ab和bA就是要添加的字符,所以求出最长公共子序列后再由字符串长度减去最长公共子序列就是要添加的字符。
求最长公共子序列可以看最长公共子序列

#include <iostream>
#include <math.h>
#include <vector>

using namespace std;

int main()
{
    vector<vector<int> > dp = vector<vector<int> >(1000, vector<int>(1000, 0));
    string str0, str1;
    cin>>str0;
    str1 = str0;
    for (int i = 0; i < str0.size(); i++) {
        str1[str0.size() - 1 - i] = str0[i];
    }
    for (int i = 1; i <= str0.size(); i++) {
        for (int j = 1; j <= str1.size(); j++) {
            if (str0[i - 1] == str1[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
            else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
        }
    }
    cout<<str0.size() - dp[str0.size()][str1.size()];
    return 0;
}



文章评论