Python中的递归组合字符串搜索

时间:2015-06-22 02:20:37

标签: python algorithm recursion combinations

我正在尝试编写一个算法,该算法将字符串 a 和更长的字符串 b 作为参数,并返回与所有字母对应的所有可能的有序索引组合。的 b'/ strong>即可。 (我承认,这是对问题的一个不好的定义。不太确定如何说出来。希望下面的例子能说明我的意思。)

以下是关于输入参数的一些假设。

  1. a b 中的所有字母都大写。
  2. len( a )< LEN(的 B'/强>)
  3. 只有 a 中的字母才会出现在 b 中。即设置( a )==设置( b
  4. a b 都允许重复字母。
  5. 示例:

    如果 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
    

    “_”只是占位符,直到我能弄明白下一步该做什么。我的脑袋疼。任何建议都会受到重视。

2 个答案:

答案 0 :(得分:3)

这是一个递归版本跟踪ab的索引aibi

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