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

    题意:

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

    示例 1:

    输入: "babad"
    输出: "bab"
    注意: "aba"也是一个有效答案。
    

    示例 2:

    输入: "cbbd"
    输出: "bb"

    思路:

      1、暴力法,O(n^3),时间复杂度不可取

      2、动态规划

          思考,当S(i,j)为回文串,并且Si-1 == Sj+1 时,可得到S(i-1,j+1)必然为回文串

          则,如下状态转移方程

                P(i,j)=(P(i+1,j1) and Si​​==Sj​​)

          初始化为

                P(i, i) = true

                P(i, i+1) = (Si == Si+1

          时间复杂度O(n^2),空间复杂度O(n^2)

      3、中心扩展法

          对于长度为n的字符串,可能有2n-1个中心,我们以中心向外扩展即可

    代码:

      动态规划法

    class Solution {
    public:
        string longestPalindrome(string s) {
            
            int n = s.length();
            
            if(n==0) return "";
            
            int dp[n][n];
            memset(dp,0,sizeof(dp));
            
            int l=0,r=0;
            
            for(int i=0;i<n;i++)
            {
                dp[i][i] = 1;
                if(i!=n)
                {
                    if(s[i]==s[i+1])
                    {
                        dp[i][i+1] = 1;
                        l = i;
                        r = i+1;
                    }
                }
            }
            
            for(int len=3;len<=n;len++)
            {
                for(int i=0;i<=n-len;i++)
                {
                    if(s[i]==s[i+len-1]&&dp[i+1][i+len-2]==true)
                    {
                        dp[i][i+len-1] = 1;
                        l = i;
                        r = i+len-1;
                    }
                }
            }
            
            return s.substr(l,r-l+1);
        }
    };

      中间扩展法

  • 相关阅读:
    [NOI2003]文本编辑器
    [TyvjP1413]费用流模板裸题
    POJ 3255 dijkstra次短路
    [TyvjP1474]二维线段树区间更新+查询
    [转]二分图的必须边
    匈牙利算法代码及理解
    jloi2013一些想法
    uva11987 并查集小技巧
    【水】tyvj1523 平面几何入门
    Tyvj1462 细节凸包
  • 原文地址:https://www.cnblogs.com/simplekinght/p/9562684.html
Copyright © 2011-2022 走看看