Leetcode3138: 同位字符串连接的最小长度

题目描述:

给你一个字符串 s ,它由某个字符串 t 和若干 t  的 同位字符串 连接而成。

请你返回字符串 t 的 最小 可能长度。

同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。

代码思路:

初始化变量

  • n:字符串 s 的长度。
  1. 遍历可能的子串长度
    • 使用一个循环从 1 到 n-1 遍历所有可能的子串长度 i
    • 检查 i 是否是 n 的因数(n % i == 0),因为只有当 i 是 n 的因数时,字符串 s 才能被完整地划分成长度为 i 的子串。
  2. 检查每个子串
    • 使用 Counter 来统计字符串 s 的前 i 个字符(即第一个子串)的字符频率,存储在 dic 中。
    • 初始化一个布尔变量 isSame 为 True,用于标记后续的子串是否与第一个子串是同位字符串。
    • 使用另一个循环从索引 i 开始,每次步进 i,直到字符串末尾,来检查每个长度为 i 的子串。
      • 对每个这样的子串,使用 Counter 统计其字符频率,存储在 scopeDic 中。
      • 比较 dic 和 scopeDic 是否相等。如果不相等,说明这些子串不是同位字符串,将 isSame 设置为 False 并跳出循环。
  3. 返回结果
    • 如果在某个长度 i 下,所有子串都是同位字符串(即 isSame 保持为 True),则返回这个长度 i,因为这是找到的最小长度。
    • 如果循环结束都没有找到这样的长度,说明整个字符串本身就是一个同位字符串(所有字符都相同),那么最小长度就是整个字符串的长度,返回整个字符串的长度 n

 代码实现:

from collections import Counter


class Solution(object):
    def minAnagramLength(self, s):
        """
        :type s: str
        :rtype: int
        """
        n = len(s)
        for i in range(1, n):
            if n % i == 0:
                dic = Counter(s[:i])
                isSame = True
                for j in range(i, n, i):
                    scopeDic = Counter(s[j:j + i])
                    # 判断每个dic中的数量是否相同
                    if dic != scopeDic:
                        isSame = False
                        break
                if isSame:
                    return i
        return n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值