LeetCode每日两题————day2

本文深入解析LeetCode上的两道经典题目:无重复字符的最长子串与最长回文子串。通过代码实现,详细阐述了解决方案,包括滑动窗口与中心扩散法等高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode每日两题————day2

LeetCode3.无重复字符的最长子串
题目详情

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

代码实现
class Solution:
    def lengthOfLongestSubstring(self, oriStr: str) -> int:
        arr = [0 for i in range(len(oriStr))]
        for i in range(1, len(oriStr)):
            start = 0
            for j in range(i-1, -1, -1):
                start = max(start, arr[j])
                if oriStr[i] == oriStr[j]:
                    arr[i] = j + 1
                    break
                if j == start:
                    arr[i] = start
                    break
        maxLen = 0
        maxIndex = 0
        for i in range(len(oriStr)):
            if i - arr[i] > maxLen:
                maxLen = i - arr[i]
                maxIndex = i
        return len(oriStr[maxIndex-maxLen:maxIndex+1])
LeetCode5. 最长回文子串
题目详情

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

代码实现

方法一:暴力匹配
此方法与第三题思路相仿,但时间复杂度略高,提交时会出现超时情况。

class Solution:

    def longestPalindrome(self, s: str) -> str:
        huiwen_str = ''
        len_huiwen = 0
        if len(s) == 1:
            return s
        for i in range(len(s)):
            for j in range(i, len(s)):
                if s[i:j+1] == s[i:j+1][::-1]:
                    if j-i+1 >len_huiwen :
                        huiwen_str = s[i:j+1]
                        len_huiwen = j-i+1

        return huiwen_str

方法二:中心扩散法
此方法思路为遍历每一个索引,以这个索引为中心,利用“回文串”中心对称的特点,往两边扩散,看最多能扩散多远。

class Solution:
    def longestPalindrome(self, s):

        if len(s) == 0:
            return ''

        # 至少是 1
        longest_palindrome = 1
        longest_palindrome_str = s[0]

        for i in range(len(s)):
            # 在该字符串是奇数的情况
            palindrome_odd, odd_len = self.__center_spread(s, i, i)
            # 在该字符串是偶数的情况
            palindrome_even, even_len = self.__center_spread(s,  i, i + 1)

            # 当前找到的最长回文子串
            cur_max_sub = palindrome_odd if odd_len >= even_len else palindrome_even
            if len(cur_max_sub) > longest_palindrome:
                longest_palindrome = len(cur_max_sub)
                longest_palindrome_str = cur_max_sub

        return longest_palindrome_str

    def __center_spread(self, s,  left, right):
        """
        left = right 的时候,此时回文中心是一条线,回文串的长度是奇数
        right = left + 1 的时候,此时回文中心是任意一个字符,回文串的长度是偶数
        """
        l = left
        r = right

        while l >= 0 and r < len(s) and s[l] == s[r]:
            l -= 1
            r += 1
        return s[l + 1:r], r - l - 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值