是否有变相括号?


12

有人给了我们一个字符串,但所有类似方括号的字符都已更改为普通字符,我们不知道是哪一个,甚至不知道有多少个。我们所知道的是,如果L1,L2,L3,...,LN是不同种类的左括号和R1,R2,R3,...,RN不同种类的相应右括号,它们都是不同的(2N个不同的括号字符),则字符串是有效的,前提是它是其中的一个(+是普通字符串串联):

  • L1+X+R1,,L2+X+R2...,,LN+X+RN哪里X是有效的字符串,

  • X+Y,其中XY是有效字符串,

  • 不是方括号字符的任何单个字符。

  • 空字符串

我们知道,在更改括号之前,它们以有效的字符串开头,并且没有将其更改为字符串中已经存在的任何字符。每个支架也至少存在一对。您可以重构哪些字符最初是左括号和右括号对(找到LiRi遵循给定条件)?

输出括号内的字符对。例如,如果(){}[]实际上是方括号字符,则可能输出(){}[]{}[]()[](){}等。对于字符串,可能有多种方式执行此操作,您只需要返回一个,这样就不会有带有更多对的方括号分配(请参见示例)。请注意,输出字符串应始终具有偶数长度。

例子:

abcc- c不能为方括号,因为没有其他字符出现两次,但ab可以为方括号对,因此您将精确输出ab

fffff -任何最多包含一个字符的字符串都不能带有方括号,因此您将返回空字符串或不输出任何内容。

aedbedebdcecdec -该字符串不能有任何括号,因为有1 a,2 bs,3 cs,4 ds和5 es,因此两个字符不会出现相同的次数,这是必须有括号的。

abcd-可能的分配是abcdabcdcdabadbcbcadacadbcbd,(以及空分配,其中所有的人都有),但你必须返回最长的任务之一,所以你必须返回abcdcdabadbc,或bcad

aabbccabc-这些都有abacbc为有效对。您必须返回这些对中的一个,无论哪一个都没有关系。

abbac-a和b具有相同的字符数,但是它们实际上不能工作,因为其中一个出现在所有其他出现的左侧和右侧。什么也没返回。

aabcdb- cdab是精确的两个括号对,因此输出cdababcd

abcdacbd-只有一对可以立即实现,但是abacbdcd,和ad都可能对你可以退货。无论选择哪个对,都有一个实例,其中有一个其他字符,它禁止任何其他对,除非是的情况下ad,其中的其他对bccb也不能单独出现,因此不可能与ad

这是代码高尔夫,因此以字节为单位的最短代码获胜。如果可能的话,来自STDIN的输入。如果不可能,请在答案中指出输入法。


1
对于输入abcd,输出adbc也可以接受,对吧?
Patrick Roberts

是的,我已将其添加到示例中。
摩擦瓜

Answers:


4

Ruby,373个字节

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

这使用堆栈解析器的golfed版本在这里

可能可以进一步简化它,但是我认为我的大脑再也无法应付了。

所有测试用例: http : //ideone.com/gcqDkK

带空格: http : //ideone.com/pLrsHg

取消高尔夫(大部分): http ://ideone.com/oM5gKX

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.