LeetCode-5. Longest Palindromic Substring

点击打开链接

解析:最长公共子串的变形,设有s、rs串,最长公共子串f(i,j)


上述公式是求最长公共子串的公式

如果要公共子串是回文串,设rs串是s串的reverse,还需要再加一个判定,即rs中的子串和s的子串位置一致

如 s = "abcdefdcba"  则 rs = "abcdfedcba",虽然s和rs最长公共子串是"abcd",但是不回文,因为rs中的"abcd"是由s中的"dcba"得到。

再如 s = "abbacd"  rs = "dcabba"  最长公共子串为abba,满足回文,因为rs中的"abba"正是有s中的"abba"得来

判断rs中的子串是否有s的来的位置公示为:

设i为s子串最后一个字符的索引(从零开始),j为为rs子串最后一个字符的索引,sub_len为子串长度,s_len为s、rs长度,则有

i + 1 + j + 1 - sub_len = s_len

所以最长回文串设有s、rs串,其中rs是s的reverse,则g(i, j)

时间复杂度O(n^2), 动态规划部分空间复杂度可以压缩至O(1)。

C++
空间复杂度O(n^2)

class Solution {
public:
    string longestPalindrome(string s)
    {
        string rs = s;
        reverse(rs.begin(), rs.end());
        int tag[1005][1005];
        int max_length = -1;
        int s_index = -1;
        for (int i = 1; i <= s.length(); i++)
        {
            for (int j = 1; j <= s.length(); j++)
            {
                if (s[i - 1] == rs[j - 1])
                {
                    tag[i][j] = tag[i - 1][j - 1] + 1;
                    if ((i + j - tag[i][j] == s.length()) && tag[i][j] > max_length)
                    {
                        max_length = tag[i][j];
                        s_index = i - 1;
                    }
                }
                else
                {
                    tag[i][j] = 0;
                }
            }
        }

        string res = "";

        for (int i = max_length - 1; i >= 0; i--)
        {
            res += s[s_index - i];
        }

        return res;
    }

};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值