递归问题

解决递归问题的核心

如何将问题分解为两个同类型的但范围更小的子问题,如何合并两个子问题的结果,子问题在何时停止。

划分问题时,可以划分为两个同等量级的,但范围更小的问题。也可以划分为一个最小量级的,和另个是该问题的补集的问题。

举例

求一个字符串所有可能的子串。如"abcd"的所有可能子串为['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd'] 

划分:将字符串划分为第一个字符 + 后续字符串。

合并:后续字符串的解 + 第一个字符与后续字符串的解逐个相加

子问题停止:只有一个字符时

# coding: utf-8
import random
import string


def get_all_sub(s):
    """
    求字符串的所有子串
    :param s:
    :return:
    """
    #判断是否停止
    if len(s) == 1:
        return [s], [s]

    #分解
    first_char = s[0]
    left_str = s[1:]

    #合并
    all_sub = []
    head_sub = []
    all_sub.append(first_char)
    head_sub.append(first_char)
    left_str_all_sub, left_str_head_sub = get_all_sub(left_str)

    for i in left_str_all_sub:  #合并剩余字符串的所有子串
        all_sub.append(i)

    for i in left_str_head_sub:   #第一个字符与剩余字符串中以其第一个字符开头的所有可能子串合并
        head_sub.append(first_char+i)

    head_sub = list(set(head_sub))
    all_sub = list(set(all_sub + head_sub))
    return all_sub, head_sub


def main():
    ran_str = ''.join(random.sample(string.ascii_letters, 4))
    print(ran_str)
    print(sorted(get_all_sub(ran_str)[0]))


if __name__ == '__main__':
    main()

输出:

atOB
['B', 'O', 'OB', 'a', 'at', 'atO', 'atOB', 't', 'tO', 'tOB']

出现的问题:

在合并时将第一个字符串与剩余字符串所有的子串合并,而不是仅与其以第一个字符开头的字串合并。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值