首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回文字符串排列数

回文字符串排列数
EN

Code Golf用户
提问于 2017-02-22 19:36:02
回答 8查看 1.2K关注 0票数 12

你的输入将是一个由小英文字母组成的字符串。

您的任务是确定作为回文的原始字符串的不同排列数。

输入字符串最多有100个字母。对于较长的字符串,结果可能非常大,因此输出应该是排列模666013的数目。

例如,

代码语言:javascript
复制
cababaa -> 3

可能的排列是:

代码语言:javascript
复制
aabcbaa
abacaba
baacaab

这是密码-高尔夫,所以最短的答案获胜!

EN

回答 8

Code Golf用户

发布于 2017-02-22 20:08:14

布氏对数 (2),15字节

代码语言:javascript
复制
{p.↔}ᶠdl%₆₆₆₀₁₃

在网上试试!

解释

代码语言:javascript
复制
{p.↔}ᶠdl%₆₆₆₀₁₃
{   }ᶠdl          Count (l) the number of distinct (d) results (ᶠ) obtainable by:
 p                  permuting {the input}
  .                 to produce an output
   ↔                that, if reversed, is still the output
        %₆₆₆₀₁₃   then take that number modulo 666013
票数 5
EN

Code Golf用户

发布于 2017-02-22 20:30:13

Mathematica,46个字节

代码语言:javascript
复制
Permutations@#~Count~_?PalindromeQ~Mod~666013&

接受一个字符列表作为输入。

效率极低,因为它实际上生成输入的所有排列,然后计数回文排列。

票数 2
EN

Code Golf用户

发布于 2017-03-19 18:17:13

Mathematica,68字节

代码语言:javascript
复制
If[i=Floor[t=Last/@Tally@#/2];Tr[t-i]<1,Multinomial@@i,0]~Mod~666013

纯函数,以字符列表作为输入,并返回整数。虽然不像马丁·安德的数学答案那么短,但它仍然是一种可爱的方法,它似乎与的Perl 6答案中的方法相同。

首先,t=Last/@Tally@#/2计算输入中所有不同字符的计数,除以2;然后i=Floor舍入t中的任何分数。注意,当原始计数中最多有一个奇数时,即当t中最多有一个分数时,输入的回文排列就会存在。我们可以通过简单地将t-i的所有元素(使用Tr)进行测试:如果答案小于1,则会出现回文排列,否则就不会。

如果存在,则i表示排列左半部分中不同字符的计数,这些字符可以任意排列。这样做的方法的数量正是Multinomial系数(某个阶乘的商数),这是数学内置的。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/110965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档