题目描述:
给你一个字符串 s ,它由某个字符串 t 和若干 t 的 同位字符串 连接而成。
请你返回字符串 t 的 最小 可能长度。
同位字符串 指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。
代码思路:
初始化变量:
n:字符串s的长度。
- 遍历可能的子串长度:
- 使用一个循环从
1到n-1遍历所有可能的子串长度i。 - 检查
i是否是n的因数(n % i == 0),因为只有当i是n的因数时,字符串s才能被完整地划分成长度为i的子串。
- 使用一个循环从
- 检查每个子串:
- 使用
Counter来统计字符串s的前i个字符(即第一个子串)的字符频率,存储在dic中。 - 初始化一个布尔变量
isSame为True,用于标记后续的子串是否与第一个子串是同位字符串。 - 使用另一个循环从索引
i开始,每次步进i,直到字符串末尾,来检查每个长度为i的子串。- 对每个这样的子串,使用
Counter统计其字符频率,存储在scopeDic中。 - 比较
dic和scopeDic是否相等。如果不相等,说明这些子串不是同位字符串,将isSame设置为False并跳出循环。
- 对每个这样的子串,使用
- 使用
- 返回结果:
- 如果在某个长度
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


被折叠的 条评论
为什么被折叠?



