-
题目:
-
1、给定一个字符串,判断这个字符串是不是有效的括号字符串,也就是满足数学算式可算性。比如,str=”(()(())())”,返回 True,给定str = “(()((())(())”,返回False。如果括号字符串中掺杂了其它的字符,则返回False
2、给定一个括号字符串,找出其中最大的子串长度,比如:给定str = “(()((())(())”,返回 8。
分析:
-
对于
问题一:有两种方法,一种即根据括号字符串满足 栈 先进后出的原则来处理,空间复杂度较高。最差情况下为 O(N)。
另一种就是设置两个变量跟踪左括号和右括号的数量,这样计算处理空间复杂度 o(1)。 -
采用动态规划的方法,设置一个数组 dp,来记录对应 str[i]结尾的字符串的最长有效子串的长度。
代码:
def brackets_is_valid_1(str):
'''
判断括号字符串是不是有效括号字符串,比如:"()()"为 True,"(()())"为 True,"())","(())"等等均为 False
方法1:建立一个栈操作,时间复杂度为一遍遍历,但是空间复杂度较高。
:param str: 括号字符串
:return: True 或者 False
'''
stack = []
for i in xrange(0, len(str)):
if str[i] != "(" and str[i] != ")":
return False
if str[i] == "(":
stack.append("(")
else:
stack.pop()
if stack != []:
return False
else:
return True
def brackets_is_valid_2(str):
'''
判断括号字符串是不是有效括号字符串,比如:"()()"为 True,"(()())"为 True,"())","(())"等等均为 False
方法2:时间复杂度不变,仍是一遍遍历的,但是空间复杂度只有o(1)。
:param str: 括号字符串
:return: True 或者 False
'''
num1, num2 = 0, 0
for i in xrange(0, len(str)):
if str[i] != "(" and str[i] != ")":
return False
if str[i] == "(":
num1 += 1
else:
num2 += 1
if num1 < num2:
return False
if num1 == num2:
return True
else:
return False
def longest_sub_brackets(str):
'''
给定一个括号字符串 str,返回最长的有效括号字符串
方法:动态规划求解,做到时间复杂度 o(n),空间复杂度 o(n)。创建一个与字符串同等长度的数组 dp[],
其含义是对应 str[i]结尾的字符串的最长有效子串的长度。然后即可开始求解。
:param str: 给定的括号字符串
:return: 最长有效子串
'''
print str
dp = []
for _ in xrange(0, len(str)):
dp.append(0)
for i in xrange(0, len(str)):
if str[i] == "(":
dp[i] = 0
if str[i] == ")":
if i != 0:
pre = i - dp[i-1] - 1
if str[pre] == "(":
dp[i] = dp[i-1] + 2 + dp[pre-1]
return max(dp)