栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

数据结构Python版练习题(二)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构Python版练习题(二)

 解题代码:

def count(s):
    if (s == "()"):
        return 1
    else:
        left = 0
        right = 0
        i = 0
        while i < len(s):
            if s[i] == '(':
                left += 1
            if s[i] == ')':
                right += 1
            if (left == right):
                if (i == len(s) - 1):
                    s = s[1:len(s) - 1]
                    sum = 2 * count(s)
                    return sum
                else:
                    sum = count(s[0:i + 1]) + count(s[i + 1:len(s)])
                    return sum
            i += 1

s = input()
print(count(s))

 解题思路分析:

本题采用的是一种递归的解题方法。

递归的终止条件是(),此时返回值1.

如果不满足终止条件,则采用以下步骤:

  1. 初始化两个变量,left表示左括号个数,right表示右括号个数。
  2. 从头开始遍历,遇到一个左括号‘(’则left加一,遇到一个右括号‘)’right加一。
  3. 如果left等于right,则说明这时候已经完成了匹配,但是如果输入类似于“(())((()))”,则此时只匹配了前四个“(())”,这时候就需要将原输入分为两个部分“(())”以及“((()))”。函数的返回值就是这两部分分别递归调用函数得到的返回值之和。如果输入类似于“((())())”;left等于right时,这时候匹配完了整个输入,这时候就需要将“((())())”拆去最外面的左括号和右括号,得到“(())()”,之后函数的返回值就等于两倍的“(())()”递归调用函数得到的返回值。
  4. 到达终止条件之后,就会得到输出。

复杂度分析:

假设输入长度为n,如程序所示:
while i < len(s):
    if s[i] == '(':
        left += 1
    if s[i] == ')':
        right += 1
    if (left == right):
        if (i == len(s) - 1):
            s = s[1:len(s) - 1]
            sum = 2 * count(s)
            return sum
        else:
            sum = count(s[0:i + 1]) + count(s[i + 1:len(s)])
            return sum
    i += 1
这一段包含一个一个循环,循环中有递归,则时间复杂度近似于O(n2)
易得空间复杂度为O(n)。

验证:

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/269227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号