Leetcode 3138. Minimum Length of Anagram Concatenation

本文介绍了解决LeetCode题目3138的方法,涉及统计输入字符串中字母的频率,判断是否能形成所有字母频次的整数倍,最终确定最小异位词串连接长度。作者给出了Python代码实现并分析了其时间和空间复杂度。

1. 解题思路

这一题的话我们首先统计出来所有的字母出现的频率。

然后,我们只需要从头开始重新计数一下,当出现的第一个位置满足所有的字母出现的频次均为所有频次的 1 / k 1/k 1/k时,即可满足条件,我们返回当前的subarray的长度即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minAnagramLength(self, s: str) -> int:
        cnt = Counter(s)
        cnt = [cnt[ch] for ch in string.ascii_lowercase]
        
        def is_divisible(cnt, _cnt):
            if any(x != 0 and y == 0 for x, y in zip(cnt, _cnt)):
                return False
            k = -1
            for i in range(26):
                if cnt[i] == 0:
                    continue
                if cnt[i] % _cnt[i] != 0:
                    return False
                if k == -1:
                    k = cnt[i] // _cnt[i]
                else:
                    if cnt[i] // _cnt[i] != k:
                        return False
            return True
        
        stat = [0 for _ in range(26)]
        for i, ch in enumerate(s):
            stat[ord(ch) - ord('a')] += 1
            if is_divisible(cnt, stat):
                return i+1
        return len(s)

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值