5. 最长回文子串 @Python @Go

本文介绍了使用中心扩散法在Python和Java中解决LeetCode问题“最长回文子串”的解决方案,通过在每个字符周围尝试构建回文字符串并比较长度来找到最长的回文子串,时间复杂度为O(n*n),空间复杂度为O(1)。

原题

https://leetcode.cn/problems/longest-palindromic-substring/

思路

中心扩散法。遍历字符串在每个下标处尝试构建两种回文字符串(aa或者aba)。取最长的字符串长度。

复杂度

时间:O(n*n)
空间:O(1)

Python代码

class Solution:
    def longestPalindrome(self, s: str) -> str:
        ans = s[0]
        for i in range(len(s)):
            # 回文类型1: aba
            j = 1
            while i - j >= 0 and i + j <= len(s) - 1 and s[i - j] == s[i + j]:
                pal = s[i - j : i + j + 1]
                if len(pal) > len(ans):
                    ans = pal
                j += 1

            # 回文类型2: aa
            k = 1
            while (
                i - (k - 1) >= 0 and i + k <= len(s) - 1 and s[i - (k - 1)] == s[i + k]
            ):
                pal = s[i - (k - 1) : i + k + 1]
                if len(pal) > len(ans):
                    ans = pal
                k += 1
        return ans

Go代码

func longestPalindrome(s string) string {
	ans := s[:1]
	for i, _ := range s {
		// 回文类型1: aba
		j := 1
		for i-j >= 0 && i+j <= len(s)-1 && s[i-j] == s[i+j] {
			pal := s[i-j : i+j+1]
			if len(pal) > len(ans) {
				ans = pal
			}
			j++
		}
		// 回文类型2: aa
		k := 1
		for i-(k-1) >= 0 && i+k <= len(s)-1 && s[i-(k-1)] == s[i+k] {
			pal := s[i-(k-1) : i+k+1]
			if len(pal) > len(ans) {
				ans = pal
			}
			k++
		}
	}
	return ans
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值