zoukankan      html  css  js  c++  java
  • 最长回文子串

    问题描述

      给出一个字符串S,求S的最长回文子串的长度

    题目分析

      这道题可以用动态规划来做。

      第一步:设d[ i ][ j ] 为来表示 s[ i ] 到 s[ j ]所表示的字符串是否是回文串,是则为1,不是则为0

      第二步:寻找状态转移方程

        1.若s[ i ] == s[ j ] ,则 s[ i ] 到 s[ j ] 表示的字符串是否为回文串取决于 d[ i - 1][ j + 1]

         因此,d[ i ][ j ] = d[ i - 1 ][ j + 1]

        2.若s[ i ] != s[ j ] ,则d[ i ][ j ] = 0

    [d[i][j] = left{ {egin{array}{*{20}{c}}
    {d[i][j] = d[i - 1][j + 1],{ m{S}}[{ m{i}}]{ m{ = = S}}[{ m{j}}]}\
    {0,{ m{S}}[{ m{i}}]!{ m{ = S}}[{ m{j}}]}
    end{array}} ight.]

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <stdlib.h>
    #include <cstdlib>
    #include <string.h>
    #include <cmath>
    using namespace std;
    char s[105];
    int len_s;
    int d[105][105];
    int max_t = 1;
    void dp() {
        for (int l = 3; l <= len_s; l++) {//枚举长度
            for (int i = 0; i + l - 1 < len_s; i++) {//枚举子串起点
                int j = i + l - 1;//子串终点
                if (s[i] == s[j] && d[i + 1][j - 1] == 1) {
                    d[i][j] = 1;
                    max_t = l;//更新最长回文子串长度 
                }
            }
        }
    }
    void init() {
        for (int i = 0; i < len_s; i++) {
            d[i][i] = 1;
            if (i < len_s - 1 && s[i] == s[i + 1]) {
                d[i][i + 1] = 1;
                max_t = 2;
            }
        }
    }
    int main() {
        scanf("%s", s);
        len_s = strlen(s);
        init();
        dp();
        cout << max_t;
        return 0;
    }

    参考:

    https://www.cnblogs.com/coderJiebao/p/Algorithmofnotes30.html

  • 相关阅读:
    第七周课程总结&实验报告(五)
    2020软件工程作业02
    自我介绍
    2019学期总结
    2019 第二次实验报告
    git 小错误
    12
    2019第十一周作业
    第十周作业
    第九周
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10460292.html
Copyright © 2011-2022 走看看