最长有效括号子串长度 c语言,括号字符串的有效性和最长有效长度

题目

给定一个字符串s,判断是不是整体有效的括号字符串。

例如:

s = ‘()’ -> True

s = ‘())’ -> False

思路

遍历字符串,记录待匹配的’(‘的个数count,遇到’(’, count += 1,遇到’)’, count -= 1,如果过程中count < 0,返回False。遍历完成,且count恰好为0,返回True

实现

def is_valid(s):

if s is None or len(s) < 2 or len(s) % 2 != 0:

return False

count = 0

for c in s:

if c not in('(', ')'):

return False

if c == ')':

count -= 1

if count < 0:

return False

else:

count += 1

return count == 0

补充题目

给定一个括号字符串,返回最长的有效括号子串长度。

例如:

‘(()())’,返回6

‘())’, 返回2

‘()(()()(’, 返回4

思路

动态规划:

如果s[i] == ‘)’, 令prev = i - dp[i-1] - 1,如果s[prev] == ‘(’,

dp[i] = dp[i-1] + 2

如果prev >= 1:

dp[i] += dp[prev-1]

实现

def max_valid_length(s):

if s is None or len(s) == 0:

return 0

dp = [0] * len(s)

for i in range(1, len(s)):

if s[i] == ')':

prev = i - dp[i-1] - 1

if prev >= 0 and s[prev] == '(':

dp[i] = dp[i-1] + 2 + (dp[prev-1] if prev >= 1 else 0)

return max(dp)

测试

def test_is_valid():

assert(is_valid('') is False)

assert(is_valid('(') is False)

assert(is_valid(')') is False)

assert(is_valid('()') is True)

assert(is_valid('()()') is True)

assert(is_valid('(())') is True)

assert(is_valid('(()())') is True)

assert(is_valid(')((())') is False)

assert(is_valid('())(') is False)

print('pass')

def test_max_valid_length():

assert(max_valid_length('(())') == 4)

assert(max_valid_length('())') == 2)

assert(max_valid_length('(()') == 2)

assert(max_valid_length('(()())') == 6)

assert(max_valid_length('()(()()(') == 4)

print('pass')

if __name__ == '__main__':

test_is_valid()

test_max_valid_length()

测试2

254d965ad458b8af4e6b6ad32c17970b.png

7947bbb903de7bbd2ea90fd5ed024dfa.png

孤舟钓客

发布了221 篇原创文章 · 获赞 132 · 访问量 32万+

他的留言板

关注

标签:count,False,assert,括号,valid,字符串,prev,有效性,dp

来源: https://blog.csdn.net/guzhou_diaoke/article/details/103980140

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值