在Python
中寻找实现,但我可以从任何内容翻译。
如果我有string
"cats "
,这是单词cats后跟四个空格,我怎样才能找到维持单词cat的顺序的所有可能的排列 。这就是我没有寻找任何排列,其中a是第一个实际字母或t等,而是cats
中字母之间的所有可能的空格排列。
一些例子:
"cats "
"c ats "
" cat s"
"c a t s "
" c a t s"
答案 0 :(得分:5)
这是一个解决方案,而不是算法:)该算法隐藏在itertools.combinations
的实现中(但请参阅下面的实现,没有内置库函数)。
from functools import reduce
from itertools import combinations
def assign(v, p):
v[p[0]] = p[1]
return v
def interp(word, letter, size):
return (''.join(reduce(assign, zip(comb, word), [letter] * size))
for comb in combinations(range(size), len(word)))
示例(使用点而不是空格使其更加明显):
>>> print('\n'.join(interp("cats", ".", 6)))
cats..
cat.s.
cat..s
ca.ts.
ca.t.s
ca..ts
c.ats.
c.at.s
c.a.ts
c..ats
.cats.
.cat.s
.ca.ts
.c.ats
..cats
实际上很容易实现combinations
(但为什么还要麻烦,因为它已经定义了?)。这里有一个解决方案,它实现了太多的元组连接以提高效率,但演示了算法:
def combs(vec, count, start=0):
if count == 0:
yield ()
else:
for i in range(start, len(vec) + 1 - count):
for c in combs(vec, count - 1, i + 1):
yield((i,) + c)
换句话说,对于每个可能的第一个位置,选择该位置并完成与剩余位置的组合。同样,您可以直接实现所需的功能:
def interp(word, letter, size):
if len(word) == 0:
yield letter * size
else:
for i in range(size + 1 - len(word)):
for comb in interp(word[1:], letter, size - i - 1):
yield letter * i + word[0] + comb
答案 1 :(得分:2)
您可以使用combinations
模块中的itertools
轻松创建4个字母的组合。
from itertools import combinations
for comb in combinations(range(len("cats ")), len("cats")):
# comb is a 4 tuple containing the indices where to insert the letters "cats".
然后你只需要将它们插入正确的位置并加入它:
empty = [" "]*len("cats ")
for comb in combinations(range(len("cats ")), len("cats")):
newstring = list(empty) # make a copy
for idx, letter in zip(comb, "cats"): # insert the letters
newstring[idx] = letter
print(''.join(newstring)) # join and print
cats
cat s
cat s
cat s
cat s
ca ts
ca t s
ca t s
ca t s
ca ts
ca t s
ca t s
[...]
答案 2 :(得分:0)
您可以使用递归。
如果您有n
个空格,请先选择第一个字母前面有多少个空格。称之为k
。然后使用n-k
空格和剩余的字母调用您的函数。
答案 3 :(得分:0)
对于字符串"猫"你有五个地方插入空格(字母之前,之后和之间)。本质上,这是将4号的所有整数分区生成为5个整数部分的问题,包括零部分。
生成此类分区的最简单方法是递归的:在每个递归级别将空间插入当前占位符,并调用下一级,并调用下一级而不进行(可能的)
答案 4 :(得分:0)
这不会有用吗?它不是算法,但它应该符合您的目的:
def check_word(word):
if word.replace(" ", "") == "cats":
return True
return False
答案 5 :(得分:0)
如果找到排列,可以通过正则表达式过滤掉它们:
import itertools
import re
string = 'cats '
pattern = ' *c *a *t *s *'
matcher = re.compile(pattern)
perms = itertools.permutations(string)
se = set([''.join(p) for p in perms])
li = list(filter(matcher.search, se))
打印:
[' cats ',
'c a t s',
'ca t s',
....
'c ats ',
' ca ts ',
' ca t s',
' c at s ',
'ca t s',
'ca ts ']
答案 6 :(得分:0)
import itertools
str_in = "cats "
str_in_nospace = str_in.replace(" ", "")
p = itertools.permutations(str_in, r=None)
for itm in p:
str_curent = ''.join(itm)
str_curent_nospace = str_curent.replace(" ", "")
if str_curent_nospace == str_in_nospace:
print str_curent