码迷,mamicode.com
首页 > 其他好文 > 详细

Longest Palindromic Substring

时间:2015-10-30 02:21:57      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

问题链接:https://leetcode.com/problems/longest-palindromic-substring/

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.

采用Manacher算法求字符串的最大回文子串, 暴力方法时间复杂度为O(n^3),效率太低。

Manacher算法介绍:http://www.open-open.com/lib/view/open1419150233417.html

在网上找了几个版本,这个文章介绍的比较清楚,其实原理很简单,开始看的时候有点绕。

c++  8ms

class Solution { 
public: 
    string longestPalindrome(string s) { 
        string replace; 
        int i = 0; 
        int *radius, extend = 0, cen = 0, max_substr = 0, start_substr = 0; 
         
        replace += "@"; 
        replace += "#"; 
        for (i = 0;i < s.size();++i) 
        { 
            replace += s[i]; 
            replace += "#"; 
        } 
        replace += "\0"; 
        radius = new int[replace.size()]; 
        memset(radius, 0, replace.size()*sizeof(int)); 
         
        for (i = 1;i < replace.size();++i) 
        { 
            if (extend >= i) 
                radius[i] = ((extend -i) > radius[2*cen - i])?radius[2*cen - i]:(extend - i); 
            else 
                radius[i] = 1; 
             
            while (replace[i - radius[i]] == replace[i + radius[i]]) 
                ++radius[i]; 
                 
            --radius[i]; 
             
            if (radius[i] + i > extend) 
            { 
                cen = i; 
                extend = radius[i] + i; 
            } 
            if (radius[i] > max_substr) 
            { 
                max_substr = radius[i]; 
                start_substr = (i - 1)/2 - max_substr/2; 
            } 
        } 
        delete []radius; 
        return s.substr(start_substr, max_substr); 
    } 
};


Longest Palindromic Substring

标签:

原文地址:http://my.oschina.net/u/2313065/blog/523824

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!