[LeetCode]Longest Palindromic Substring

来源:互联网 发布:触摸查询软件 编辑:程序博客网 时间:2024/06/18 01:46

题目要求如下:

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.

也就是传说中的求最长回文子串的问题,具体的算法分析请点本博客的文章《求最长回文子串(Longest Palindromic Substring)》

尝试用动态规划和中心扩展法都做了一下,发现动态规划的时间要比中心扩展法多出4倍左右,可能是因为对数组的访问导致了时间的增加,而中心扩展法只需要遍历字串而不需要同时访问2维数组,所以更快。另外在LeetCode中用动态数组会出错,不知道什么原因。

以下是2种方法的代码,欢迎大牛指导交流~

1.动态规划法

AC,Runtime: 552 ms

//LeetCode_Longest Palindromic Substring//Written by zhou//2013.11.22class Solution {public:     string longestPalindrome(string s) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        size_t n = s.length();        /*bool **dp = new bool*[n];        for (size_t i = 0; i < n; ++i)        {            dp[i] = new bool[n];        }*/                bool dp[1000][1000];                //为基准情况赋值        int startPos = 0;        int max = 1;        for (size_t i = 0; i < n; ++i)        {            dp[i][i] = true;            if (i + 1 < n)            {if (s[i] == s[i+1]){dp[i][i+1] = true;startPos = i;max = 2;}else dp[i][i+1] = false;            }        }                //动规求解,前面已求len = 1, len = 2的情况        for (int len = 3; len <= n; ++len)        {            for (int i = 0; i < n - len + 1; ++i)            {                int j = i + len - 1;                if (dp[i+1][j-1] && s[i] == s[j]){dp[i][j] = true;int curLen = j - i + 1;if (curLen > max){startPos = i;max = curLen;}}else dp[i][j] = false;                            }        }        //释放二维数组        /*for (size_t i = 0; i < n; ++i)           delete[] dp[i];                delete[] dp;*/        return s.substr(startPos,max);    }};


 

2. 中心扩展法

AC,Runtime: 132 ms

//LeetCode_Longest Palindromic Substring//Written by zhou//2013.11.22class Solution {public:     string longestPalindrome(string s) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.               size_t n = s.length();        int startPos = 0;        int max = 1;        for (int i = 0; i < n; ++i)        {            int oddLen = 0, evenLen = 0, curLen;            oddLen = Palindromic(s,i,i);                        if (i + 1 < n)               evenLen = Palindromic(s,i,i+1);                        curLen = oddLen > evenLen? oddLen : evenLen;                        if (curLen > max)            {                max = curLen;                if (max & 0x1)                  startPos = i - max / 2;                else                   startPos = i - (max - 1) / 2;            }        }                return s.substr(startPos,max);    }        int Palindromic(const string &str, int i, int j)    {        size_t n = str.length();        int curLen = 0;        while (i >= 0 && j < n && str[i] == str[j])        {--i;            ++j;        }        curLen = (j-1) - (i+1) + 1;        return curLen;    }};


 

原创粉丝点击