diff --git a/Dynamic-Programming/LongestValidParentheses.js b/Dynamic-Programming/LongestValidParentheses.js new file mode 100644 index 0000000000..9947bf7087 --- /dev/null +++ b/Dynamic-Programming/LongestValidParentheses.js @@ -0,0 +1,43 @@ +/* + LeetCode -> https://leetcode.com/problems/longest-valid-parentheses/ + + Given a string containing just the characters '(' and ')', + find the length of the longest valid (well-formed) parentheses substring. +*/ + +const longestValidParentheses = (s) => { + const n = s.length + const stack = [] + + // storing results + const res = new Array(n).fill(-Infinity) + + for (let i = 0; i < n; i++) { + const bracket = s[i] + + if (bracket === ')' && s[stack[stack.length - 1]] === '(') { + res[i] = 1 + res[stack[stack.length - 1]] = 1 + stack.pop() + } else { + stack.push(i) + } + } + + // summing all adjacent valid + for (let i = 1; i < n; i++) { + res[i] = Math.max(res[i], res[i] + res[i - 1]) + } + + // adding 0 if there are none so it will return 0 instead of -Infinity + res.push(0) + return Math.max(...res) +} + +const main = () => { + console.log(longestValidParentheses(')()())')) // output -> 4 + console.log(longestValidParentheses('')) // output -> 0 + console.log(longestValidParentheses('(()')) // output -> 2 +} + +main()