Longest Palindromic Substring

来源:互联网 发布:spss数据分析简单案例 编辑:程序博客网 时间:2024/05/18 03:46

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

方法1:用两个下标 i 和 j 追踪每个重复子串的左右两边界。
 
代码如下:
class Solution {public:    string longestPalindrome(string s) {        int maxLen = 1;        int pos = 0;                for(int i = 0; i < s.size(); i++)  // 长度为奇数的重复子串        {            int j = i - 1;             int k = i + 1;            while(j >= 0 && k < s.size() && s[j] == s[k])            {                k++;                j--;                            }            if(k - j - 1 > maxLen)            {                maxLen = k - j - 1;                pos = j + 1;            }        }        for(int i = 0; i < s.size(); i++)  // 长度为偶数的重复子串        {            int j = i;             int k = i + 1;            while(j >= 0 && k < s.size() && s[j] == s[k])            {                k++;                j--;            }            if(k - j - 1 > maxLen)            {                maxLen = k - j - 1;                pos = j + 1;            }        }                return s.substr(pos, maxLen);    }};

方法2:动态规划。
 
代码如下:
class Solution {public:    string oddString(string s)  // 插入字符使得字符串每个字符都能当成中心向两边扩展    {        string ret("^");        for(int i = 0; i < s.size(); i++)        {            ret += "#" + s.substr(i, 1);        }        ret += "#$";        return ret;    }    string longestPalindrome(string s) {        string ret = oddString(s);        int n = ret.size();        int right = 0, j = 0;        int *len = new int[n];        for(int i = 1; i < n - 1; i++)        {            if(right > i)            {                len[i] = min(right - i, len[2 * j - i]);            }            else            {                len[i] = 0;            }                        while(ret[i - len[i] - 1] == ret[i + len[i] + 1])            {                len[i]++;            }                        if(i + len[i] > right)            {                right = i + len[i];                j = i;            }        }                int maxLen = 0;        int pos = 0;        for(int i = 1; i < n - 1; i++)        {            if(len[i] > maxLen)            {                maxLen = len[i];                pos = i;            }        }                return s.substr((pos - maxLen - 1) / 2, maxLen);    }};

0 0