到包含子串的回文的最小汉明距离


17

这是受一个现已删除的CS.SE问题启发的。

任务

给定两个非空输入字符串A和B,输出从A到包含B作为子字符串的回文的最小距离。距离由字符替换的数量(汉明距离)定义。

限制条件

  • 明智的输入:存在回文。这意味着| A | ≥| B |。
  • A和B仅包含小写ASCII字符,小写和大写字母是不同的(其他所有字符也一样)。
  • 如果您的语言无法处理ASCII字符,则也可以使用整数(或其他一些合理的数据类型),并且可以选择将范围限制为128个元素。
  • 您可以从标准输入,函数参数,命令行参数等中获取输入。
  • 您可以在标准输出,返回值等上给出结果。
  • 您不需要给出工作回文,到一个最小的距离就足够了。

例子

A                   B            Output
thilloaoyreot       hello        4 (thelloaolleht)
benjonson           stack        9 (stackcats)
neversaynever!      odd          9 (neveroddoreven)
ppcggcpp            gg           0 (ppcggcpp)
stars               tat          1 (stats)

计分

这是代码高尔夫,以字节为单位的最短代码获胜。

Answers:


5

Pyth,19个字节

hSmsnVQd/#z_I#^+Qzl

示范

极端强力方法。用任一字符串中的字符生成所有适当长度的字符串,过滤回文并包含第二个输入,映射到与第一个字符串的汉明距离,输出最小。

说明:

hSmsnVQd/#z_I#^+Qzl
hSmsnVQd/#z_I#^+QzlQ     Variable introduction
                         Q = string A, z = string B.
               +Qz       Concatenate A and B
              ^   lQ     Form every string of length equal to len(A)using
                         characters from the concatenation.
             #           Filter on
           _I            Invariance under reversal (palindrome)
         #               Filter on
        / z              Nonzero occurences of B
  m                      Map to
    nV                   !=, vectorized over
      Qd                 A and the map input
   s                     Sum (gives the hamming weight)
hS                       Min

我想到的是这样的东西,但认为O((m + n)^ n)太O(坏)。:D
PurkkaKoodari '16

3

Pyth,45个字节

hSmsnVQdf}zTsmm+hc2KsXcd+Bklz1z_hc2PKh-lQlz_B

在线尝试。 测试套件。

我仍然对结果如何并不完全满意。但是至少现在没有解释就很难理解。(我猜成功了吗?)

说明

  • 接受A作为Q,B作为z
  • m_BQ将A及其反向计算如下d
    • mh-ldlz计算k从0到0的所有内容len(A) - len(B)
      • +Bklz得到一对k, k + len(B)
      • cdd这些指数分割。
      • X1z用B替换第二(中间)部分。
      • Ks连接碎片并保存到K。现在将B插入到kA或其反面的位置。
      • hc2将结果字符串一分为二,并保留第一部分。这将为字符串的一半提供可能的中间字符。
      • hc2PK删除最后一个字符并进行相同的拆分,保留第一部分。这样就给出了一半的字符串,而没有可能的中间字符。
      • +_将短片的反面加到长片上。我们现在有一个回文。
  • s 将A及其反向的结果串联起来。
  • f}zT 删除所有不包含B的字符串。
  • m为所有产生的字符串计算以下内容d
    • nVQd 用A获得成对不等式。这为需要更改的对提供了True。
    • s汇总列表。这给出了汉明距离。
  • hS 采取最小的结果。

1

的JavaScript(火狐30+),152个 146字节

(A,B)=>Math.min(...[...Array(A[l='length']-B[l]+1)].map((_,i)=>[for(c of q=A.slice(j=t=0,i)+B+A.slice(i+B[l]))t+=(c!=A[j])+(c!=q[q[l]-++j])/2]|t))

蛮力法:生成A和B的每个可能的重叠,将它们都变成回文图,计算与A的汉明距离,并取最小的结果距离。

可能还会打更多的高尔夫球...

测试片段

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.