实现Russian Nesting Quine:模拟Matryoshka doll嵌套逻辑的编程任务
实现俄罗斯套娃字符串的逐层展开
这是个挺有意思的问题,核心得先摸清楚这种嵌套字符串的构成规律,才能逆向写出展开的逻辑。咱们先从你给的例子入手:
- N=1(基础版):
abcd→ 拆成前半段ab(记为A)和后半段cd(记为B) - N=2:
ababcdcd→ 其实是A*2 + B*2(也就是abab + cdcd) - N=3:
abababcdcdcd→ 对应A*3 + B*3(ababab + cdcdcd)
规律一下子就清晰了:N次嵌套的字符串,是基础段前半部分重复N次,加上基础段后半部分重复N次。那我们的目标就是,拿到这个N次的字符串,输出N-1次的版本——也就是A*(N-1) + B*(N-1),当N=1时,结果就是空字符串(因为任何字符串重复0次都是空)。
实现步骤
- 拆分输入字符串:合法的嵌套字符串长度一定是偶数(因为AN和BN长度相等),所以先把字符串分成前后两半,前半是A的N次重复,后半是B的N次重复。
- 提取重复单元和次数:分别找出前后两半的最小重复单元(也就是A和B),以及重复的次数N。
- 生成展开后的字符串:用A重复N-1次,加上B重复N-1次,就是N-1次嵌套的版本。
Python代码实现
首先写一个辅助函数,用来找出字符串的最小重复单元和重复次数:
def get_repeat_unit_and_count(s): str_len = len(s) # 遍历可能的单元长度,从1到字符串长度的一半 for unit_len in range(1, str_len // 2 + 1): if str_len % unit_len == 0: unit = s[:unit_len] # 验证重复后是否等于原字符串 if unit * (str_len // unit_len) == s: return unit, str_len // unit_len # 如果没有找到重复单元(比如单个字符的情况),单元就是字符串本身,次数为1 return s, 1
然后是主函数,处理展开逻辑:
def matryoshka_unfold(nested_str): # 空字符串直接返回空(对应N=0版本) if not nested_str: return "" # 先验证输入合法性:长度必须是偶数 total_len = len(nested_str) if total_len % 2 != 0: raise ValueError("输入不是合法的俄罗斯套娃字符串:长度必须为偶数") mid = total_len // 2 first_half = nested_str[:mid] second_half = nested_str[mid:] # 提取前后两半的重复单元和次数 A, n = get_repeat_unit_and_count(first_half) B, m = get_repeat_unit_and_count(second_half) # 验证合法性:前后两半的重复次数必须一致,且单元长度相同 if n != m or len(A) != len(B): raise ValueError("输入不是合法的俄罗斯套娃字符串") # 生成N-1次嵌套的版本 return A * (n - 1) + B * (n - 1)
测试验证
咱们用你给的例子测试一下:
# N=3版本 → 输出N=2版本 print(matryoshka_unfold("abababcdcdcd")) # 输出: ababcdcd # N=2版本 → 输出N=1版本 print(matryoshka_unfold("ababcdcd")) # 输出: abcd # N=1版本 → 输出N=0版本(空) print(matryoshka_unfold("abcd")) # 输出: 空字符串 # N=0版本 → 输出空 print(matryoshka_unfold("")) # 输出: 空字符串
这个实现支持任意合理的N值,只要输入是符合规则的嵌套字符串就行。如果输入不合法(比如长度奇数、前后两半重复次数不一致等),函数会抛出明确的错误提示,方便排查问题。
内容的提问来源于stack exchange,提问作者Jo King
相关产品推荐
相关产品推荐

