LeetCode Longest Palindromic Substring

来源:互联网 发布:4glte网络优化前景如何 编辑:程序博客网 时间:2024/06/08 08:37

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.


题意就是找最长的回文子串。

以每个点做中心点然后向外扩展的做法:

class Solution {public:        string longestPalindrome(string s) {        string ans;        int len = 0, low = 0, high = 0;        for(int i = 0; i < s.size(); i++){            int j = p1(s, i);            if((j-i)*2+1 > len){                low = 2*i - j;                high = j;                len = high - low + 1;            }            j = p2(s, i);            if((j-i)*2 > len){                low = 2*i-j+1;                high = j;                len = (j-i)*2;            }        }        for(int i = low; i <= high; i++)            ans += s[i];        return ans;    }    int p1(const string &s, int cur){        int i = cur, j = cur;        while(i >=0 && j < s.size()){            if(s[i] != s[j])                break;            i--;            j++;        }        return j-1;    }    int p2(const string &s, int cur){        int i = cur, j = cur+1;        while(i >=0 && j < s.size()){            if(s[i] != s[j])                break;            i--;            j++;        }        return j-1;    }};

动态规划的做法

class Solution {    public:    string longestPalindrome(string s) {        string ans;        bool dp[1005][1005] = {false};        int n = s.length();        for(int i = 0; i < n; i++)            dp[i][i] = true;        for(int i = 0; i < n-1; i++)            dp[i][i+1] = (s[i] == s[i+1]);                for(int j = 2; j < n; j++){            for(int i = j-2; i >= 0; i--){                if((s[i] == s[j]) && (dp[i+1][j-1]))                    dp[i][j] = true;            }        }        int low = 0, high = 0, len = 0;        for(int i = 0; i < n; i++)            for(int j = i; j < n; j++){                if(dp[i][j] && (j-i+1) > len){                    low = i;                    high = j;                    len = high - low + 1;                }            }        ans = s.substr(low, len);        return ans;    }};

虽然时间复杂度都为O(n),但动态规划比中心扩展的速度要慢一点,因为向外扩展很多情况下扩展一小段就跳出了,动态规划还一直找下去。

还有一个Manacher algorithm 时间复杂度是O(n),

string longestPalindrome(string str) {    int len=str.length();    if(len<=1)return str;    string str1=str;    reverse(str1.begin(),str1.end());    if(str1==str)        return str;    string s;    s += "$#";    for(int i = 0; i < len; i++){        s += str[i];        s += "#";    }    s +="$";    int n=s.size();    int mx=0,Maxl=0,id=0;    int *p = new int[n];    memset(p,0,sizeof(p));    for(int i=1;i<n-1;i++){        p[i]=mx>i?min(mx-i,p[2*id-i]):1;        while(s[i-p[i]]==s[i+p[i]])            p[i]++;        if(p[i]>mx-i){            mx = p[i]+i;            id=i;        }        Maxl=max(Maxl,p[i]);    }    int mid=0;    for(int i=0;i<n;i++){        if(p[i]==Maxl)            mid=i;    }    int size=Maxl-1;    delete []p;    if(mid%2==0)        return str.substr(mid/2-size/2-1,size);    else        return str.substr((mid-size-1)/2,size);}


0 0
原创粉丝点击