Lyndon字分解


11

背景

一个林登字是一个非空字符串,它是严格按字典比所有其他的旋转小。可以将任何字符串唯一地分解为Lyndon单词的串联,这样这些子单词在字典上就不会增加;您的挑战是尽可能简洁地执行此操作。

细节

您应该实现一个函数或程序,该函数或程序枚举任何可打印ASCII字符串的Lyndon字分解,以便将结果子字符串输出为某种数组或流。字符应按其代码点进行比较,并允许使用所有标准输入和输出方法。与通常的,以字节为单位的最短程序获胜。

测试用例

''           []
'C'          ['C']
'aaaaa'      ['a', 'a', 'a', 'a', 'a']
'K| '        ['K|', ' ']
'abaca'      ['abac', 'a']
'9_-$'       ['9_', '-', '$']
'P&O(;'      ['P', '&O(;']
'xhya{Wd$'   ['x', 'hy', 'a{', 'Wd', '$']
'j`M?LO!!Y'  ['j', '`', 'M', '?LO', '!!Y']
'!9!TZ'      ['!9!TZ']
'vMMe'       ['v', 'MMe']
'b5A9A9<5{0' ['b', '5A9A9<5{', '0']


请注意,这等效于按<=ness 拆分。(我不知道如何更好地表达这一点:|)
CalculatorFeline

这是否等同于重复采用比第一个字符大的所有字符和前缀?
xnor

@xnor号。“ abac”是林登语。
user1502040

@ user1502040我知道,联系很有趣。我建议添加一些测试用例来捕捉这一点。
xnor

Answers:


5

Pyth,17 16字节

-1字节感谢isaacg!

hf!ff>Y>YZUYT+./

在线尝试!

说明

hf!ff>Y>YZUYT+./
              ./    Take all possible disjoint substring sets of [the input]
             +      plus [the input] itself (for the null string case).
 f                  Filter for only those sets which
  !f        T       for none of the substrings
    f  >YZUY        is there a suffix of the substring
     >Y             lexographically smaller than the substring itself.
h                   Return the first (i.e. the shortest) such set of substrings.

1
hf!ff>Y>YZUYT+./占空字符串大小写(少1个字节)。
isaacg

很好,谢谢!我觉得一定有更短的路要走。
notjagan


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.