5-最长回文子串

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

解法:

首先想到的是用两个idx在string移动,然后判断这两个idx之间的string是否是回文串。暴力判断:

string longestPalindrome(string& s)
{
    if (s.length() < 2)
    {
        return s;
    }

    int ii = 0;    //如果都是相同的字符;
    for (; ii < s.length(); ii++)
    {
        if (s[ii] == s[0])
        {
            continue;
        }
        break;
    }
    if (ii == s.length())
    {
        return s;
    }

    string result = s.substr(0,1);
    int idx = 0, idx2 = 0;
    int maxSubLen = 0;    //记录最长字串
    while (idx <= s.length()/2)
    {
        //idx2 = idx + 1;//直接+1的方式,提交后运行超时,因为需要遍历O(n^2)
        idx2 = idx + maxSubLen;//判断当前 idx idx2的间距是否大于maxSubLen,如果小于则不比较;
        while (idx2 < s.length())
        {
            //先判断第一个跟最后一个是否相同
            if (s[idx] != s[idx2])
            {
                idx2++;
                continue;
            }

            int n = (idx2 - idx + 1) / 2;
            int i = 0;
            int tmp1 = idx;
            int tmp2 = idx2;
            for (; i < n; i++)
            {
                if (s[++tmp1] != s[--tmp2])
                {
                    break;
                }
            }
            if (i == n)//表示 [idx ... idx2]是回文串
            {
                if (idx2 - idx + 1 > maxSubLen)
                {
                    maxSubLen = idx2 - idx + 1;
                    result = s.substr(idx, maxSubLen);
                }
            }

            idx2++;
        }

        idx++;
    }
    return result;
}

注意:

  上面的idx2=idx+maxSubLen,如果直接用idx2=idx+1的话,提交后运行时间超过限制。。。因为当前的最长回文串的长度是maxSubLen,再判断idx,idx+1已经没有意义了,直接 idx2=idx+maxSubLen 减少判断

运行结果:

感觉还是要使用数据结构,或者什么算法,因为执行时间太慢了

题解:

TODO

动态规划等

 

posted @ 2020-09-30 13:23  adfas  阅读(110)  评论(0编辑  收藏  举报