📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 31(1)

📅  最后修改于: 2023-12-03 14:50:46.742000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2013 | 问题 31

这是一道关于递归的算法题。给出了一个字符串和一个子字符串,要求在字符串中找到所有与子字符串相同的子串,并返回它们在字符串中第一次出现的位置。如果字符串中没有子串,则返回-1。

算法思路

可以使用递归实现,从字符串的头部开始比较,如果找到和子字符串相同的子串,则记录它在字符串中的位置,并把剩余的字符串作为新的字符串,继续递归处理。如果没有找到,则返回-1。

具体实现可以先在字符串中查找子字符串,如果找到则记录其位置,然后将字符串从该位置之后的部分作为新的字符串再次递归处理。

代码实现
def find_substring(string, sub_string, start=0):
    """
    在字符串中查找子串
    :param string: 字符串
    :param sub_string: 子串
    :param start: 开始查找的位置
    :return: 找到子串时返回位置,否则返回-1
    """
    if start >= len(string):
        return -1

    index = string.find(sub_string, start)

    if index == -1:
        return -1

    return index


def find_all_substrings(string, sub_string):
    """
    查找字符串中所有子串的位置
    :param string: 字符串
    :param sub_string: 子串
    :return: 所有子串的位置
    """
    positions = []

    while True:
        index = find_substring(string, sub_string)

        if index == -1:
            break

        positions.append(index)
        string = string[index + 1:]

    return positions
测试用例
assert find_all_substrings("ABCBDCBDBDBEBD", "BD") == [4, 7, 11, 14]
assert find_all_substrings("ABCDEF", "ZZ") == []
assert find_all_substrings("AABBCC", "BB") == [1, 3]
assert find_all_substrings("ABABABA", "ABA") == [0, 2, 4]
assert find_all_substrings("ABCDABCD", "BCD") == [1, 5]

以上代码实现可以找到字符串中所有相同的子串,并返回它们在字符串中第一次出现的位置。