LeetCoder 5. Longest Palindromic Substring

来源:互联网 发布:淘宝装修软件破解版 编辑:程序博客网 时间:2024/05/29 14:57

题意

求一个字符串的最长回文子串

思路

解法一:
暴力求解,枚举两个端点,检查范围内的字符串是否为回文串,时间复杂度O(n3)
解法二:
DP求解,最长公共子序列变形一下,将字符串倒序进行DP,时间复杂度O(n2)
解法三:
manacher算法,可以百度一下算法的讲解,时间复杂度O(n)

结果

Your runtime beats 78.46 % of cpp submissions

代码

class Solution {public:    string longestPalindrome(string s) {        return manacher(s);    }private:    string manacher(string s){        int len = s.length();        string str = "";        str += '$';        str += '#';        for(int i = 0;i < len;i++){            str += s[i];            str += '#';        }        len = str.length();        int *p = new int[len + 1];        int Max = 0, id = 0;        for(int i = 1;i < len;i++){            if(Max > i){                p[i] = min(p[2 * id - i], Max - i);            } else{                p[i] = 1;            }            while(str[i + p[i]]== str[i - p[i]]){                p[i]++;            }            if(i + p[i] > Max){                Max = i+ p[i];                id = i;            }        }        s = "";        Max = 0;        int loc = -1;        for(int i = 1; i < len;i++){            if(p[i] > Max){                Max = p[i];                loc =i;            }        }        for(int i = loc - Max + 1;i < loc + Max;i++){            if(str[i] != '#')                s += str[i];        }        delete(p);        return s;    }};
0 0
原创粉丝点击