015_最长有效括号

知识点:括号、栈、动态规划

LeetCode第三十二题:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/

还有种更秀的解法,就是运作左右指针,有双指针的味道,时间为O(n),空间O(1)

语言:GoLang

// 一般来说,括号相关的题目,都能用栈解决,只是怎么运用栈而已,思路!
func longestValidParentheses(s string) int {
	length := len(s)
	if length < 2 {
		return 0
	}

	result := 0
	stack := []int{-1}

	for i := 0; i < length; i++ {
		if s[i] == '(' {
			stack = append(stack, i)
		}else {
			if len(stack) > 0 {
				stack = stack[:len(stack) - 1]
			}

			if len(stack) == 0 {
				stack = append(stack, i)
			}else {
				if i - stack[len(stack) - 1] > result {
					result = i - stack[len(stack) - 1]
				}
			}
		}
	}

	return result
}

// DP解法:以第i个元素结尾的子串的最长有效括号
func longestValidParentheses_(s string) int {
	length := len(s)
	dp := make([]int, length)

	if length < 2 {
		return 0
	}

	if s[0] == '(' && s[1] == ')' {
		dp[1] = 2
	}

	result := dp[1]
	for i := 2; i < length; i ++ {
		if s[i] == ')' {
			if s[i - 1] == '(' {
				dp[i] = dp[i - 2] + 2
			}

			pre := i - 1 - dp[i - 1]
			if s[i - 1] == ')' && pre >= 0 && s[pre] == '('{
				dp[i] = 2 + dp[i - 1]

				prePre := i - 2 - dp[i - 1]
				if prePre > 0 {
					dp[i] += dp[prePre]
				}
			}
		}

		if dp[i] > result {
			result = dp[i]
		}
	}

	return result
}
posted @ 2020-03-11 21:15  Cenyol  阅读(136)  评论(0)    收藏  举报