标签:count False assert 括号 valid 字符串 prev 有效性 dp
题目
给定一个字符串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
牛客网-括号字符串的有效性
牛客网-括号字符串的最长有效长度
标签:count,False,assert,括号,valid,字符串,prev,有效性,dp 来源: https://blog.csdn.net/guzhou_diaoke/article/details/103980140
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。