重建我的娃娃娃


20

背景

一个俄罗斯套娃(或俄语嵌套娃娃)是一组相互匹配的内部娃娃。我不小心弄混了我的俄罗斯套娃娃娃的收藏,我不记得里面有哪个。

目的

给定唯一字符串的列表,将它们分类到嵌套的俄罗斯套娃中。每个字符串是一个单独的玩偶,而俄罗斯套娃则是一个字符串列表。

规则

min(a,b)字符串a和的字典最小化b。让其a ⊂ b表示a为的子字符串b。然后,

  1. 娃的清单必须按字典顺序排序
  2. 字符串a可以适合字符串,b如果a ⊂ b
  3. 如果a ⊂ ba ⊂ ca则将进入内部min(b,c)
  4. 如果a ⊂ cb ⊂ c,但a ⊄ b b ⊄ a,则只有min(a,b)会进入c
  5. 如果既a ⊂ cb ⊂ c,且也a ⊂ b,则只会b进入内部c。即,超级字符串先于子字符串,这样娃就不会过早终止。

例子

In:
hahaha, hah, lol, lololol, bahaha, bah, haha, ah

Out:
bahaha, bah, ah
hahaha, haha, hah
lololol, lol

In:
aa, aaaa, a, aaaaaaaaaa

Out:
aaaaaaaaaa, aaaa, aa, a

3
在这里的第一篇文章,请指出任何需要的哑巴/修复方法。
sujeet

2
欢迎来到PPCG!如果您不确定发布的内容是否足够好,可以先将其发布在沙盒中。
user202729 '18

2
这不是强制性的,只需将其保留在此处即可。社区喜欢它。
user202729 '18

2
将来@sujeet,请尝试先发布到沙箱。在您将挑战发布到主站点之前,这里是获得有关挑战的反馈的地方。现在不必担心,因为这个挑战看起来还不错,但是这是未来需要考虑的事情。
Rɪᴋᴇʀ

3
应该是什么结果ab, ba, aba, bab?根据规则3,abba都应加入aba,而根据规则4,ba不能与aba或进入bab
Zgarb

Answers:


2

Python 2,298字节

def f(x,E=enumerate):
 o=[]
 while any(x):
	for k,p in E(x):
	 e=0
	 if sum(i(p,j)for j in x)<1:
		for d,r in E(o):
		 if i(p,r[-1])*((r[-1]<e)or e==0):m,e=d,r[-1]
		if e:o[m]+=[p]
		else:o+=[[p]]
		x[k]=''
 print sorted(o)
i=lambda p,b:(b!=p)*any([p==b[j:j+len(p)]for j in range(len(b)-len(p)+1)])

在线尝试!

-28字节,包含@dylnan的提示,@ Dennis的错误查找和@ Mr.Xcoder的错误修复


1
301个字节。刚刚变成i了lambda函数,并将变量名称更改outo
dylnan '18

1
297个字节(E =枚举)
dylnan

函数必须是可重用的,但out变量永远不会改变。在线尝试!
丹尼斯

要解决该问题,需要298个字节。另外,out3个字符的变量名...严重的:P?
Xcoder先生18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.