package main

// 穷举
func longestValidParenthesesOld(s string) int {
	pair := 0
	for i := 0; i < len(s); i++ {
		left, right := 0, 0
		for j := i; j < len(s); j++ {
			if s[j] == '(' {
				left++
			} else {
				right++
			}
			if right > left {
				break
			}
			if left == right && left > pair {
				pair = left
			}
		}
	}
	return pair * 2
}

func longestValidParentheses(s string) int {
	stack := []int{}
	// max: longest length, beg: idx of last ')' before current stack
	max, beg := 0, -1
	for i := 0; i < len(s); i++ {
		if s[i] == '(' {
			stack = append(stack, i)
		} else if s[i] == ')' {
			if len(stack) > 0 {
				// pop last '('
				stack = stack[:len(stack)-1]
			} else {
				beg = i
				continue
			}
			if len(stack) == 0 {
				// curr idx is the end of curr seq
				max = maxInt(max, i-beg)
			} else {
				// top of stack is the beg of curr seq
				max = maxInt(max, i-stack[len(stack)-1])
			}
		}
	}
	return max
}

// func main() {
// 	fmt.Println(longestValidParentheses("("))
// 	fmt.Println(longestValidParentheses("()()("))
// 	fmt.Println(longestValidParentheses("()(((()(()(((()(()())))(()"))
// }