首页 软件代码

LeetCode-题库-刷题(5)


5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。
具体题目链接

Python(参考leetcode答案)

class Solution:
    def longestPalindrome(self, s: str) -> str:
        lens=len(s)
        t=[[False]*lens for _ in range(lens)]
        #首先先建立矩阵t, (n x n的全为False的矩阵) 用来表示字符串s的每一个子串是否为回文串
        # 回文子串个数 = n + n - 1 + ... + 1,
        # e.g. 字符串babad有5 + 4 + 3 + 2 + 1 = 15种子串。
        # start用来跟踪最长回文子串的起点, max_len代表最长回文子串的长度。
        start, max_len = 0, 1
        # 如果字符串是babad
        # 下面的双循环则进行以下遍历 (遍历所有可能的15个子字符串):
        # b
        # ba,    a
        # bab,   ab,   b,
        # baba,  aba,  ba,  a
        # babad, abad, bad, ad, d
        # dp[left][right]代表s被left和right指针相夹而得的子字符串
        # e.g. left = 0, right = 3, dp[left][right] = baba
        for R in range(len(s)):
            for L in range(0,R+1): 
                span=R-L+1#至少=1
                if s[L]==s[R]:
                    #s[L]==s[R]相同则进行更新t矩阵
                    #此处有两种情况,一种:L=R-1,两数相邻,则判断是否相同。
                    # 另一种L=R,则相当于直接赋值true
                    if span>2:
                        t[L][R]=s[L]==s[R] and t[L+1][R-1]
                    else:
                        t[L][R]=s[L]==s[R] 
                if  t[L][R] and max_len<span:
                    start,max_len=L,span
        return s[start:start+max_len]

思路:通过动态规划解决问题。具体思路可见python代码注释,思路参考文章和官方文档。

GO(参考leetcode答案)

func longestPalindrome(s string) string {
    lens:=len(s)
    t:= make([][]bool, lens)
    start,max_len:=0,1
    for R:=0;R<lens;R++{
        t[R] = make([]bool, lens)
        for L:=0;L<R+1;L++{
            span:=R-L+1
            if s[L]==s[R]{
                if span>2{
                    if s[L]==s[R] && t[L+1][R-1]{
                         t[L][R]=true
                    }
                }else{
                    if s[L]==s[R]{
                         t[L][R]=true
                    }
                }
            }else{
                t[L][R]=false
            }
            if  t[L][R] && max_len<span{
                start,max_len=L,span
            }
        }

    }
    return s[start:start+max_len]
}

思路:思路参考python,但需要注意通过make建立二维数组后,仍需要通过make建立每一个一维数组。





文章评论

目录