[leetcode-Q5] Longest Palindromic Substring

来源:互联网 发布:js实现分页 编辑:程序博客网 时间:2024/06/02 13:10

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

暴力解法的时间复杂度为 O3

下面提供一个时间复杂度为 O2 的解法

动态规划法

动态规划是在暴力解法上进行优化,通过激励一些我们需要的东西,来避免暴力解法中很多重复的判断。

假设 flag[i][j] 表示子串 s[i ... j] 是否时回文,那么对于动态规划表 flag 的打表方式如下:

  • 初始化:

    {flag[i][j]=trueothers=false(i>=j)

  • 状态转移方程:

    flag[i][j]={flag[i+1][j1]falseifs[i]==s[j]ifs[i]!=s[j]

代码实现如下:(附带测试程序)

#include <iostream>#include <vector>using namespace std;string longestPalindrome(string s) {    int len = s.size();    if (len == 1)        return s;    int start, max = 0;    bool flag[len][len];    for (int i = 0; i < len; i++)        for (int j = 0; j < len; j++) {            if (i >= j)                flag[i][j] = true;            else                 flag[i][j] = false;        }    for (int j = 1; j < len; j++)         for (int i = 0; i < j; i++) {            if (s[i] == s[j]) {                flag[i][j] = flag[i + 1][j - 1];                if (flag[i][j] == true && j - i + 1 > max)                {                    max = j - i + 1;                    start = i;                }            }            else                 flag[i][j] = false;        }    return s.substr(start, max);}int main () {    string s = "abcdeedcbaaksdlfkk";    cout << longestPalindrome(s) << endl;    string ss = "a";    cout << longestPalindrome(ss) << endl;    string sss = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";    cout << longestPalindrome(sss) << endl;    return 0;}

还有其他更优的解法,有时间了再来补充完善。

0 0