在字符列表中递归搜索字符串

时间:2021-01-21 09:58:20

标签: python recursion

我有一个问题要解决,即递归搜索列表中的字符串(字符串和列表的长度至少为 2)并返回它的位置。例如:如果我们有 ab 和列表 ['a','b','c'],函数应该返回 '(0,2)',因为 ab 从索引 0 开始并在 {{1} 结束}}(我们再添加一个)。
如果我们有 1 和相同的列表,函数应该返回 bc
如果我们有 '(1,3)' 和相同的列表,函数应该返回 ac

请注意,我正在解决一个更大的问题,即递归搜索字符矩阵中的字符串(从上到下或仅从左到右出现),但我离解决方案还很远,所以我开始通过在给定索引上的矩阵行中搜索单词(如在普通列表中搜索单词),因此我的代码可能有 not found,将其视为普通列表,如 {{1} } 例如。
请注意,我的代码充满了错误并且无法运行,因此我解释了我在其下尝试执行的操作。

char_mat[idx]

我在这里尝试做的想法是找到递归的基数(当列表的长度达到 2 时),有了这个小问题,我只是检查我的单词是否等于连接在一起时的字符作为字符串,如果相等则返回字符串的位置,否则返回未找到
然后对于递归步骤,我发送没有第一个字符的列表,并且我的起始索引 +1,所以如果这个函数为我完成所有工作(作为递归假设),我需要检查列表中的最后一个元素我的递归有效。 (但我真的不知道这是否是这样做的方法,因为最后一个索引可能不在单词中,所以我被卡住了)。

现在我知道我犯了很多错误而且我离正确答案还差得很远,我真的很感激任何解释或帮助以了解如何解决这个问题并继续我的更大问题是在字符矩阵中找到字符串。

2 个答案:

答案 0 :(得分:1)

l = ["a","b","c"]


def my_indexes(pattern, look_list, indx_val):
    if pattern == "".join(look_list)[:2]:
        return indx_val, indx_val+1
    else:
        if len(look_list) == 2:
            return None
        return my_indexes(pattern, look_list[1:],indx_val+1)

print(my_indexes("bc",l,0))

两个选项: 1.我们找到了我们要找的case,所以我们列表的前两个元素是“ab”,或者 2. "a" 和 "b" 不是我们列表的前两个元素。在没有列表第一个元素的情况下调用相同的函数,并增加 indx_val 所以我们的结果将是正确的。当 len(list) = 2 并且我们没有找到案例时,我们停止这样做。 (假设我们正在寻找 2 个字符的长度)

编辑:所有长度

l = ["a","b","c","d"]


def my_indexes(pattern, look_list, indx_val):
    if pattern == "".join(look_list)[:len(pattern)]:
        return indx_val, indx_val+len(pattern) # -1 to match correct indexes
    else:
        if len(look_list) == len(pattern):
            return None
        return my_indexes(pattern, look_list[1:],indx_val+1)

print(my_indexes("cd",l,0))

答案 1 :(得分:1)

我拼凑了一个小例子,应该能让你领先几步

char_mat = [['c', 'e', 'l', 'k', 'v'],]
search_word = 'lk'

def search_at_idx(search_word, char_mat, idx, start=0):
    if len(char_mat[idx]) < len(search_word):
        return 'not', 'found'
    if ''.join(char_mat[idx][:len(search_word)]) == search_word:
        return start, start+len(search_word)
    char_mat[idx] = char_mat[idx][1:]
    start, end = search_at_idx(search_word, char_mat, idx, start+1)
    return start, end 

print(search_at_idx(search_word, char_mat, 0))

指出你的一些错误:

  • 在您的递归中,您使用 char_mat[idx][1:]。这将传递列表的一部分,而不是修改后的矩阵。这意味着您下次调用 char_mat[idx] 将检查数组中该索引处的字母。我建议使用调试器并逐步执行程序来检查变量的内容

  • 您可以始终假设找到的单词与您要搜索的单词的长度相同,而不是使用 start 和 end。所以你必须看的距离总是start + len(search_word)

如果您对我的代码有任何其他问题,请发表评论。

如果算作loop漏洞,这里有一个列表理解示例:

foundword = list(map("".join, list(zip(*([char_mat[idx][i:] + list(char_mat[idx][i-1]) for i in range(len(search_word))])))[:-1])).index(search_word)
print((foundword, foundword + len(search_word)) if foundword else 'Not found')