最长回文字串--动态规划

时间:2022-04-11 08:10:42
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string str;
    cin >> str;
    int len = str.size();
    vector<vector<int> >dp(len, vector<int>(len, 0));

    //边界条件 长度为1 或者长度为2 的状态

    int ans=0;
    for (int i = 0; i < len; ++i)
    {
        dp[i][i] = 1;
        if (i < len - 1)
        {
            if (str[i] == str[i + 1])
                dp[i][i + 1] = 1;
            ans = 2;
        }
    }

    for (int l = 3; l <= len; ++l)
    {
        for (int i = 0; i + l - 1 < len; ++i)
        {
            int j = i + l - 1;
            if (str[i] == str[j]&& dp[i + 1][j - 1] == 1)
            {
                dp[i][j] = 1;
                    ans = l;
            }
        }
    }
    cout << ans << endl;
    system("pause");
    return 0;
}