LeetCode笔记:Weekly Contest 346

本文是关于LeetCode周赛346的解题笔记,涵盖了四道题目,包括MinimumStringLengthAfterRemovingSubstrings、LexicographicallySmallestPalindrome、FindthePunishmentNumberofanInteger等,提供了Python代码实现和解题思路。

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

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这题用一个栈结构基本也就搞定了,就不过多赘述了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def minLength(self, s: str) -> int:
        stack = []
        for ch in s:
            if ch == "D" and len(stack) > 0 and stack[-1] == "C":
                stack.pop()
            elif ch == "B" and len(stack) > 0 and stack[-1] == "A":
                stack.pop()
            else:
                stack.append(ch)
        return len(stack)

提交代码评测得到:耗时67ms,占用内存16.3MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题只需要从中间位置反推即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def makeSmallestPalindrome(self, s: str) -> str:
        n = len(s)
        chars = [ch for ch in s]
        l, r = (n-2)//2, (n+1)//2
        while l >= 0:
            if chars[l] != chars[r]:
                chars[l] = chars[r] = min(chars[l], chars[r])
            l -= 1
            r += 1
        return "".join(chars)

提交代码评测得到:耗时207ms,占用内存16.5MB。

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题我的思路就是先找出所有的punishment数然后保存在缓存当中,然后对任意的n遍历一下即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    @lru_cache(None)
    def is_punishment(self, n):
        s = str(n*n)
        m = len(s)

        @lru_cache(None)
        def dp(idx, r):
            if idx >= m:
                return r == 0
            x = 0
            success = False
            for i in range(idx, m):
                x = x*10 + int(s[i])
                if success or x > r:
                    break
                success = success | dp(i+1, r - x)
            return success
        return dp(0, n)
            
    def punishmentNumber(self, n: int) -> int:
        res = 0
        for i in range(1, n+1):
            if self.is_punishment(i):
                res += i*i
        return res

提交代码评测得到:耗时2074ms,占用内存31.6MB。

4. 题目四

给出题目四的试题链接如下:

这一题放弃了,没啥思路……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值