zoukankan      html  css  js  c++  java
  • LeetCode 5

    一、问题描述

    Description:

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

    给一个字符串S,找出它的最长回文子串。假定S的最大长度是1000,并且存在唯一的最长回文子串。


    二、解题报告

    请看《最长回文子串的求解》。

    首先,暴力解法就不用试了,这个肯定过不了。

    然后我使用动态规划法,时间复杂度O(n2)

    class Solution {
    public:
        string longestPalindrome(string s) {
            int len = s.size();
            if(len <= 1) return s;
            // 动态规划表,全部初始化为true
            vector<vector<bool>> dp(len, vector<bool>(len, true));
    
            int start = 0, maxlen = 0;
            for(int k=2; k<=len; ++k) {    // 枚举子串的长度
                for(int i=0; i<=len-k; ++i) {  // 枚举子串起始位置
                    int j = i+k-1;
                    if(s[i] == s[j] && dp[i+1][j-1])
                    {
                        dp[i][j] = true;
                        start = i;
                        maxlen = k;
                    }
                }
            }
    
            return s.substr(start, maxlen);
        }
    };

    但是,出乎我的意料的是,居然超时了!!


    最后采用中心扩展法 AC 了,虽然理论上时间复杂度也是O(n2),但可能因为系数更小,所以实际使用中速度更快。

    class Solution {
    public:
        // 分别向左右扩展,返回扩展后的字符串
        string expand(string s, int left, int right) {
            int len = s.size();
            while (left>=0 && right<len && s[left] == s[right]) 
            {
                left--;
                right++;
            }
            return s.substr(left+1, right-left-1);
        }
    
        string longestPalindrome(string s) {
            int len = s.size();
            if(len<=1) return s;
    
            string longest;
            for (int i=0; i<len-1; i++) 
            {
                string p1 = expand(s, i, i);  // 奇数
                if (p1.size() > longest.size())
                    longest = p1;
    
                string p2 = expand(s, i, i+1);  // 偶数
                if (p2.size() > longest.size())
                    longest = p2;
            }
            return longest;
        }
    };





    LeetCode答案源代码:https://github.com/SongLee24/LeetCode


  • 相关阅读:
    HTML5-拖拽
    POJ1182食物链(并查集)
    欧拉函数之HDU1286找新朋友
    Another kind of Fibonacce(矩阵快速幂,HDU3306)
    我的第一道java_A+B
    bestcoder#33 1002 快速幂取余+模拟乘,组合数学
    快速幂模版
    bestcoder#33 1001 高精度模拟
    poj2446_二分图
    poj3984_bfs+回溯路径
  • 原文地址:https://www.cnblogs.com/songlee/p/5738064.html
Copyright © 2011-2022 走看看