zoukankan      html  css  js  c++  java
  • LeetCode "Longest Palindromic Substring"

    2D DP is an intuitive solution of course, but I got an MLE error, so I simplified it into a 1D DP:

    class Solution {
    public:
        void goDp(vector<int> &dp, int &maxLen, int &is, int &ie, int startLen, int len, string &s)
        {
            for(int ilen = startLen; ilen < len; ilen += 2)
            for(int i = 0; i < len - ilen; i ++)
            {
                bool bEq = s[i] == s[i + ilen];
                dp[i] = bEq ? (dp[i + 1] > 0 ? dp[i + 1] + 2 : 0) :    0;
                if( dp[i] > maxLen)
                {
                    maxLen = dp[i];
                    is = i; ie = i + ilen;
                }
            }
        }
        string longestPalindrome(string s) {
            int len = s.length();
            if(len == 0) return "";
    
            int maxLen = -1; int is = 0, ie = 0;
            //     Init
            vector<int> dp; dp.resize(len);
            
            //    Starting from 2
            for(int i = 0; i < len - 1; i ++)
            {
                if(s[i] == s[i + 1]) dp[i] = 2;
                else dp[i] = 0;
                if( dp[i] > maxLen)
                {
                    maxLen = dp[i];
                    is = i; ie = i + 1;
                }
            }        
            goDp(dp, maxLen, is, ie, 3, len, s);
    
            //    Starting from 1
            std::fill(dp.begin(), dp.end(), 1);
            goDp(dp, maxLen, is, ie, 2, len, s);
    
            return s.substr(is, ie - is + 1);
        }
    };

    Since loop on current length n depends linearly on dp data with length n-1, we can use 1D DP. And there are two cases of oddeven lengthes.

  • 相关阅读:
    better-scroll 介绍
    promise 异步编程
    vue网址路由的实时检测
    浏览器本地存储的使用
    获取元素的位置
    如何设置动画的运动效果
    实现对称加密及非对称公钥加密
    Centos 7系统启动修复
    Centos 7服务启动文件
    内核编译-4.12
  • 原文地址:https://www.cnblogs.com/tonix/p/3893606.html
Copyright © 2011-2022 走看看