【发布时间】:2014-03-16 16:29:47
【问题描述】:
有没有什么模式可以用来解决如何创建一个由 'X' 'Y' 组成的回文字符串
【问题讨论】:
-
提示:我有一些长度为 n/2 的字符串。可以用来构造一个长度为 n 的回文吗?
-
@IfLoop:很棒的评论,希望我在发布答案之前看到它。会让它更微妙一点。 ;-)
标签: python palindrome
有没有什么模式可以用来解决如何创建一个由 'X' 'Y' 组成的回文字符串
【问题讨论】:
标签: python palindrome
假设n 是偶数。生成由x和y组成的每个长度为n/2的字符串,并附加其镜像得到回文。
练习 1:证明这会生成 所有 个长度为 n 的回文。
练习 2:找出当n 为奇数时该怎么做。
【讨论】:
itertools.product;等等。选择。
首先在给定字符列表的情况下生成所有可能的字符串:
>>> from itertools import product
>>> characters = ['x','y']
>>> n = 5
>>> [''.join(i) for i in product(characters, repeat=n)]
['xxxxx', 'xxxxy', 'xxxyx', 'xxxyy', 'xxyxx', 'xxyxy', 'xxyyx', 'xxyyy', 'xyxxx', 'xyxxy', 'xyxyx', 'xyxyy', 'xyyxx', 'xyyxy', 'xyyyx', 'xyyyy', 'yxxxx', 'yxxxy', 'yxxyx', 'yxxyy', 'yxyxx', 'yxyxy', 'yxyyx', 'yxyyy', 'yyxxx', 'yyxxy', 'yyxyx', 'yyxyy', 'yyyxx', 'yyyxy', 'yyyyx', 'yyyyy']
然后过滤掉非回文:
>>> n = 4
>>> [''.join(i) for i in product(characters, repeat=n) if i[:n/2] == i[::-1][:n/2]]
['xxxx', 'xyyx', 'yxxy', 'yyyy']
>>> n = 5
>>> [''.join(i) for i in product(characters, repeat=n) if i[:n/2] == i[::-1][:n/2]]
['xxxxx', 'xxyxx', 'xyxyx', 'xyyyx', 'yxxxy', 'yxyxy', 'yyxyy', 'yyyyy']
如果你不喜欢列表推导中的 if 条件,可以使用filter():
>>> from itertools import product
>>> characters = ['x','y']
>>> n = 5
>>> def ispalindrome(x): return x[:n/2] == x[::-1][:n/2];
>>> filter(ispalindrome, [''.join(i) for i in product(characters, repeat=n)])
['xxxxx', 'xxyxx', 'xyxyx', 'xyyyx', 'yxxxy', 'yxyxy', 'yyxyy', 'yyyyy']
【讨论】:
xyyxy 不是回文