从回文子串中缝合回文


14

给定一个字符串l,找到所有回文子pl(包括重复和单一字符串)。接下来,将所有子字符串重新排列p为有效回文(可能有多个正确答案)。如果不可能重新排列p为单个回文,则您的程序可能具有不确定的行为(错误,堆栈溢出,退出,John Dvorak的挂起/过早杀害等)。


例子

有效的测试用例

l = anaa
p = ['a', 'n', 'a', 'a', 'aa', 'ana']
result = anaaaaana or aanaaanaa or aaananaaa

l = 1213235
p = ['1', '2', '1', '3', '2', '3', '5', '121', '323']
result = 1213235323121

l = racecar
p = ['r', 'a', 'c', 'e', 'c', 'a', 'r', 'cec', 'aceca', 'racecar']
result = racecarcecaacecracecar (there are others)

l = 11233
p = ['1', '11', '1', '2', '3', '33', '3']
result = 113323311 or 331121133

l = abbccdd
p = ['a', 'b', 'bb', 'b', 'c', 'cc', 'c', 'd', 'dd', 'd']
result = bbccddaddccbb or ccbbddaddbbcc or (etc...)

l = a
p = ['a']
result = a

无效的测试用例(不可能)

l = 123456789
p = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
result = <not possible, behavior undefined>

l = hjjkl
p = ['h', 'j', 'jj', 'j', 'k', 'l']
result = <not possible, behavior undefined>

l = xjmjj
p = ['x', 'j', 'jmj', 'm', 'j', 'jj', 'j']
result = <not possible, behavior undefined>

规则

  • 如果输入单词本身是回文,则输入将始终有效。
  • 仅应返回一个子字符串,您选择的子字符串只要有效就可以是任意的。
  • 如果输入没有可行的输出,则您的代码可能具有未定义的行为。
  • 输入内容之间仅包含ASCII可打印字符0x20-0x7E
  • 这是,最低字节数是获胜者。

1
的第一个建议结果"abbccdd"是错误的:后两个字母应该是"bb",而不是"dd"
致命

我们可以返回一个子字符串数组,而不是单个字符串吗?
毛茸茸的

我可以接受字符列表作为输入吗?
alephalpha

1
悬挂行为是可以接受的,您的意思是悬挂输入信息的人吗?
John Dvorak

@JohnDvorak澄清了。
魔术章鱼缸

Answers:


8

Brachylog,10个字节

{s.↔}ᶠpc.↔

在线尝试!

false.如果不可能,则失败(即打印)。

说明

{   }ᶠ         Find all…
 s.              …substrings of the input…
  .↔             …which are their own reverse
      p        Take a permutation of this list of palindromes
       c.      The output is the concatenation of this permutation
        .↔     The output is its own reverse

3

椰子,140字节

s->p(map(''.join,permutations(p(v for k in n(s)for v in n(k[::-1])))))[0]
from itertools import*
n=scan$((+))
p=list..filter$(x->x==x[::-1])

在线尝试!


3

JavaScript(ES6),193个字节

“看马,没有内置置换!” (是的...很长...)

如果没有解决方案,则返回一个空数组。

f=(s,a=[].concat(...[...s].map((_,i,a)=>a.map((_,j)=>s.slice(i,j+1)))).filter(P=s=>[...s].reverse().join``==s&&s),m=S=[])=>S=a.map((_,i)=>f(s,b=[...a],[...m,b.splice(i,1)]))>''?S:P(m.join``)||S

演示版

怎么样?

让我们将代码分成较小的部分。

我们定义P(),如果s是回文,则返回s的函数,否则返回false

P = s => [...s].reverse().join`` == s && s

我们计算输入字符串s的所有子字符串。使用P(),我们隔离了非空回文,并将它们存储在数组a中

a = [].concat(...[...s].map((_, i, a) => a.map((_, j) => s.slice(i, j + 1)))).filter(P)

主要的递归函数f()a作为输入并计算其所有排列。只要排列本身是回文(一旦加入),它将更新S,并最终返回S的最终值。

f = (                        // given:
  a,                         //   a[] = input array
  m = S = []                 //   m[] = current permutation of a[]
) =>                         //   and S initialized to []
  S = a.map((_, i) =>        // for each element at position i in a[]:
    f(                       //   do a recursive call with:
      b = [...a],            //     b[] = copy of a[] without the i-th element
      [...m, b.splice(i, 1)] //     the element extracted from a[] added to m[]
    )                        //   end of recursive call
  ) > '' ?                   // if a[] was not empty:
    S                        //   let S unchanged
  :                          // else:
    P(m.join``) || S         //   update S to m.join('') if it's a palindrome


2

05AB1E13 12字节

ŒʒÂQ}œJʒÂQ}¤

在线尝试!

-1字节感谢Magic Octopus Urn和Enigma。


J自动分解,因此您不需要€J公正J; 同样,您应该返回一种回文,而不是全部。 在线尝试!对于相同的字节数有效。
魔术章鱼缸

@MagicOctopusUrn固定,谢谢!
Kaldo

Ùć可能是¤(或其他多种选择)
Emigna

@Emigna不确定为什么我没有看到Ù不需要。
魔术章鱼缸

谜语我不好,出于一个未知原因,我认为我们应该展示所有独特的回文,因此是原始的Ù。感谢小费,固定!
Kaldo

2

Stax,13 个字节

绬►Ö∞j∞:Æ╘τδ

运行测试用例(在我的当前机器上大约需要10秒钟)

这是同一程序的相应ascii表示。

:e{cr=fw|Nc$cr=!

它不是纯粹的蛮力,但是和我写的蛮力实现一样小。大约10分钟后,那个崩溃了我的浏览器。无论如何,这是它的工作方式。

:e                  Get all contiguous substrings
  {cr=f             Keep only those that are palindromes
       w            Run the rest of the program repeatedly while a truth value is produced.
        |N          Get the next permutation.
          c$        Copy and flatten the permutation.
            cr=!    Test if it's palindrome.  If not, repeat.
                    The last permutation produced will be implicitly printed.

2

红宝石131 123 120个字节

->s{m=->t{t==t.reverse}
(1..z=s.size).flat_map{|l|(0..z-l).map{|i|s[i,l]}}.select(&m).permutation.map(&:join).detect &m}

在线尝试!

Lambda接受一个字符串并返回一个字符串。退货nil不存在解决方案时。

-5字节:替换select{|t|l[t]}select(&l)

-3字节:替换map{..}.flattenflat_map{...}

-1个字节:循环遍历子字符串长度和子字符串开始,而不是遍历子字符串开始和子字符串结束

-2字节:z在首次使用时声明,而不是事先声明

->s{
  l=->t{t==t.reverse}        # Lambda to test for palindromes
  (1..z=s.size).flat_map{|l| # For each substring length
    (0..z-l).map{|i|         # For each substring start index
      s[i,l]                 # Take the substring
    }
  }                          # flat_map flattens the list of lists of substrings
  .select(&l)                # Filter to include only palindromic substrings
  .permutation               # Take all orderings of substrings
  .map(&:join)               # Flatten each substring ordering into a string
  .detect &l                 # Find the first palindrome
}

1

Pyth,13个字节

h_I#sM.p_I#.:

在线尝试!

-1字节感谢Xcoder先生


大声笑,我确定没有其他人使用Pyth,因此在看到您的答案之前,我提交了自己的单独答案(现已删除)。您可以使用h_I#sM.p_I#.:e_IDsM.p_I#.:保留13个字节。
Xcoder先生

@ Mr.Xcoder哦哈哈:P是的,我几乎从未使用过Pyth,不知道为什么我决定使用它。谢谢!
HyperNeutrino

1

Python 3,167字节

lambda a:g(sum(k,[])for k in permutations(g(a[i:j+1]for i in range(len(a))for j in range(i,len(a)))))[0]
g=lambda k:[e for e in k if e==e[::-1]]
from itertools import*

在线尝试!

-2个字节,感谢Xcoder先生


如果使用,a[i:j+1]则可以使用for j in range(i,len(a))-2个字节。
Xcoder先生18年

1

杰普特,19个字节

受Japt阻碍(尚未)能够获得 全部字符串的子字符串(部分是由于我当前的疲劳程度!)。

产出 undefined如果没有解决方案,则。

Êõ@ãX fêQÃc á m¬æêQ

尝试一下


说明

                        :Implicit input of string U
Ê                       :Length of U
 õ                      :Range [1,Ê]
  @      Ã              :Pass each X through a function
   ãX                   :  Substrings of U of length X
      f                 :  Filter
       êQ               :    Is it a palindrome?
          c             :Flatten
            á           :Permutations
              m         :Map
               ¬        :  Join to a string
                æêQ     :Get first element that is a palindrome

1
您只是想¬从答案中删除子字符串列表有关的问题吗?
魔术章鱼缸

1
以为我可以删除,但后来我需要,æ_¬êQ所以无论如何都不会保存任何字节!
毛茸茸的

哈哈哈,从现在开始,我一定会提防您节省字节的方式;)。我尝试自己删除它以进行检查,但是意识到japt命令无法像我认为的那样大声笑。
魔术章鱼缸

1

外壳,12个字节

ḟS=↔mΣPfS=↔Q

在线尝试!

说明

ḟS=↔mΣPfS=↔Q  Implicit input, a string.
           Q  List of substrings.
       f      Keep those
        S=↔   that are palindromic (equal to their reversal).
      P       Permutations of this list.
    mΣ        Flatten each.
ḟ             Find an element
 S=↔          that is palindromic.

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.