• LeetCode-5:Longest Palindromic Substring(最长回文子字符串)


    描述:给一个字符串s,查找它的最长的回文子串。s的长度不超过1000。

    Input: "babad"
    Output: "bab"
    Note: "aba" is also a valid answer.
    我是采用动态规划解决此题的。官方的solutions中提供了几种思路,包括我使用的DP。这里摘要如下:

    思路1:
    将s反转得到s',然后查找s和s'的最长公共子串substring,那么substring就是最长回文子串。
    比如:s = "caba", s' = "abac" => substring = "aba"
    但是存在特殊的情况如:
    s = "abacdfgdcaba", s' = "abacdgfdcaba" => substring = "abacd"
    可以看到substring并不是回文,这是因为s中存在子串s1和s2,而reverse(s1)=s2,但是s1本身并不是回文。
    对这种情况,可以对比Index,检测反转后的substring是不是由反转前的substring得来。
    至于查找s1和s2的最长公共子串,更优秀的方法可以参见:https://en.wikipedia.org/wiki/Longest_common_substring_problem

    思路2:
    直接暴力检索所有字符串是否回文,略过。

    思路3(DP):
    定义P(i,j)表示在s中索引i~j的字串是否为回文。则有:
    P(i,j) = (P(i+1,j-1) and s[i] == s[j]),即当且仅当字符s[i] == s[j]且子串s(i+1,j-1)是回文时,s(i,j)是回文;
    基础情形:
    P(i,i) = true
    P(i,i+1) = s[i] == s[i+1]

    思路4:
    任何一个回文子串都是由一个分隔点不断向两侧扩展相同字符得来的,因此只需要以每个字符或字符间隔点起始向两侧尽可能扩展,筛选最长的子串即可。此思路看起来似乎不怎么样,但是其时间复杂度也只有O(n的平方),而空间复杂度只有O(1)。

    思路5:
    详细见:https://articles.leetcode.com/longest-palindromic-substring-part-ii/
  • 相关阅读:
    HDOJ 1202 The calculation of GPA
    HDOJ 1197 Specialized Four-Digit Numbers
    HDOJ 1196 Lowest Bit(二进制相关的简单题)
    HDOJ 1194 Beat the Spread!(简单题)
    NOIP2018游记
    CF1043
    洛谷P1280 尼克的任务
    洛谷P1155 双栈排序
    SPOJ6340 ZUMA
    chessboard
  • 原文地址:https://www.cnblogs.com/Jackie-Snow/p/9524989.html
Copyright © 2020-2023  润新知