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 @   Cenyol  阅读(128)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示