LeetCode笔记:Biweekly Contest 112

LeetCode双周赛112:字符串操作与滑动窗口问题解题笔记
本文介绍了LeetCode双周赛112中的四个题目,涉及字符串操作、字符频率分析和滑动窗口算法,通过实例展示了如何使用Python解决这些题目,包括计数字符频次、检查字符串是否可以通过操作变平等。

0. 吐槽

这一次的双周赛题目委实是有点水了,难怪第一名的大佬只花了8分钟就全部搞定了……

1. 题目一

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

1. 解题思路

这一题其实不难看出:

  1. 奇数和偶数位上的字符不会交叉变化,即奇数位上的字符永远在奇数位上,偶数位的字符永远在偶数位上;
  2. 奇偶性相同的字符经过若干次变换可以变换为任意顺序;

因此,要使得两个string可以相同,只要判断奇偶位上的字符是否一致即可,我们统计一下频次即可完成。

2. 代码实现

给出python代码实现如下:

class Solution:
    def canBeEqual(self, s1: str, s2: str) -> bool:
        odd1 = Counter(s1[1::2])
        odd2 = Counter(s2[1::2])
        even1 = Counter(s1[::2])
        even2 = Counter(s2[::2])
        return all(odd2[k] == v for k, v in odd1.items()) and all(even2[k] == v for k, v in even1.items())

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

2. 题目二

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

1. 解题思路

这一题虽然形式变换了一下,string长度也变得比较长,但是本质上和第一题是完全一样的,我们复用第一题的代码即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def checkStrings(self, s1: str, s2: str) -> bool:
        odd1 = Counter(s1[1::2])
        odd2 = Counter(s2[1::2])
        even1 = Counter(s1[::2])
        even2 = Counter(s2[::2])
        return all(odd2[k] == v for k, v in odd1.items()) and all(even2[k] == v for k, v in even1.items())

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

3. 题目三

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

1. 解题思路

这一题用一个滑动窗口考察一下所有的连续长度为 k k k的subarray当中unique字符的个数是否不少于 m m m个,然后对符合的subarray求一下最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxSum(self, nums: List[int], m: int, k: int) -> int:
        res = 0
        cnt, s = {}, 0
        for i, x in enumerate(nums):
            if x not in cnt:
                cnt[x] = 1
            else:
                cnt[x] += 1
            s += x
            if i-k >= 0:
                cnt[nums[i-k]] -= 1
                s -= nums[i-k]
                if cnt[nums[i-k]] == 0:
                    cnt.pop(nums[i-k])
            if i >= k-1 and len(cnt) >= m:
                res = max(res, s)
        return res

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

4. 题目四

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

1. 解题思路

这道题其实也不难,我们首先统计一下原始的string当中各个字符出现的频次,即题目中 f ( c ) f(c) f(c)函数,然后要给出一个长度为 k k k的unique array,使得beauty最大,也就是 f ( c ) f(c) f(c)的和最大,那么,其结果就必然是在所有的字符当中挑选 f ( c ) f(c) f(c)最大的 k k k个字符来组成一个子序列。

因此,这个题目就变成了一个排列组合问题,首先在所有的 f ( c ) f(c) f(c)当中挑选最大的 k k k个值,如果有重复的,那么就是从中在进行一次挑选组合数,然后将其对应的值(可选项)连乘即可得到最终的答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countKSubsequencesWithMaxBeauty(self, s: str, k: int) -> int:
        MOD = 10**9 + 7
        
        freq = Counter(s)
        freq = sorted(freq.values(), reverse=True)

        if k > len(freq):
            return 0
        
        def C(n, k):
            res = 1
            for i in range(k):
                res = res * (n-i) // (i+1)
            return res
                
        
        tgt = Counter(freq[:k])
        cnt = Counter(freq)
        res = 1
        for k, v in tgt.items():
            res = (res * C(cnt[k], v) * pow(k, v, MOD)) % MOD
        return res

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值