我正在尝试编写一个算法,该算法将字符串 a 和更长的字符串 b 作为参数,并返回与所有字母对应的所有可能的有序索引组合。的 b'/ strong>即可。 (我承认,这是对问题的一个不好的定义。不太确定如何说出来。希望下面的例子能说明我的意思。)
以下是关于输入参数的一些假设。
示例:
如果 a =“SLSQ”且 b =“SQLSSQLSQ”,则结果如下:
result = [
[0,2,3,5],
[0,2,3,8],
[0,2,4,5],
[0,2,4,8],
[0,2,7,8],
[0,6,7,8],
[3,6,7,8],
[4,6,7,8]]
另一种看待它的方式;我明确地写出了上面例子中递归算法的结果。数字是 b 字母的索引。
0123456789
SQLSSQLSQS SLSQ
S LS Q -> 0235
S LS Q -> 0238
S L SQ -> 0245
S L S Q -> 0248
S L SQ -> 0278
S LSQ -> 0678
S LSQ -> 3678
S LSQ -> 4678
我相当肯定我可以编写一个强力算法来解决这个问题,但我真正想要的是一个干净易处理的pythonic递归算法。不幸的是,我的递归编码技巧并不那么令人印象深刻。这就是我到目前为止所做的:
def recurse(a_str, b_str, res):
if len(a_str) == 0:
return _, _, res
for token in b_str:
if token == a_str[0]:
_ = a_str[0]
_, _, res = recurse(a_str[1:], b_str, res)
else:
_, _, res = recurse(a_str, b_str[1:], res)
return _, _, res
“_”只是占位符,直到我能弄明白下一步该做什么。我的脑袋疼。任何建议都会受到重视。
答案 0 :(得分:3)
这是一个递归版本跟踪a
和b
的索引ai
和bi
def recurse(a_str, b_str, ai=0, bi=0):
if not a_str:
return
if ai < len(a_str):
b_lim = len(b_str) - len(a_str) + ai + 1
for i in range(bi, b_lim):
if a_str[ai] == b_str[i]:
for r in recurse(a_str, b_str, ai+1, i+1):
yield (i,) + r
else:
yield ()
list(recurse(a, b))
[(0, 2, 3, 5),
(0, 2, 3, 8),
(0, 2, 4, 5),
(0, 2, 4, 8),
(0, 2, 7, 8),
(0, 6, 7, 8),
(3, 6, 7, 8),
(4, 6, 7, 8)]
答案 1 :(得分:1)
itertools的组合将帮助您轻松完成此任务。所以你不需要为它编写手动递归函数。
size