构建长度为L的字符串,其中包含N个回文

时间:2015-12-08 14:47:01

标签: string algorithm palindrome

给定字符串 L N 的长度 - 回文数量,构建一个字符串,其中包含 N 回文子串。例如,

OrderedDict([('B', 85.68779888033738), ('S', 56.80461868495082)])

更新:所有目标回文的长度应为> 1

1 个答案:

答案 0 :(得分:0)

您可以为字符串 S 中的每个字符引入变量 s_i = {0,1} ,然后如果子字符串 S [a..b> ] 是回文,它一定是那个

(s_a = s_b) and (s_{a+1} = s_{b-1}) and ... 

因此,对于每个子字符串,您都有一个子句,并且必须满足 N 。这将问题简化为可满足性。

如果您能将其解决为优化问题,我也很好奇: 对于每个子字符串引入一个变量 x_i = {0, 1},代表子字符串数i是回文的事实(让它为 S [a..b] )。然后为该子字符串的子句引入变量 y_i

(s_a-s_b)^2 + (s_{a+1}-s_{b-1})^2 +  ... 

然后您需要满足\sum_{x_i} = N并最小化\sum_{x_i * y_i}。如果存在解决方案并且目标始终是非负的,那么显然最小值 0

修改

优化理念似乎是错误的,因为如果y_i = 0需要强制执行,那么它必须是x_i = 0,但是可满足性的提法应该有效