题意:

image.png

解题思路:

  1. 思路:
  2. 1、若当前元素是'(',则入栈
  3. 2、若是')'时,说明前面一个括号有可能是'('
  4. 2.1、若栈顶元素能和')'匹配,直接将栈顶元素pop出,则当前元素ipop元素后的栈顶元素之间的长度是以i结尾的最长有效括号的长度
  5. 2.2、若栈顶元素不能和')'匹配,则直接加入到栈中

PHP代码实现:

  1. class Solution {
  2. function longestValidParentheses($s) {
  3. $max = 0;
  4. $dp = array_fill(0, strlen($s), 0);
  5. for ($i = 1; $i < strlen($s); $i++) {
  6. if ($s[$i] == ')') {
  7. //右括号前边是左括号
  8. if ($s[$i - 1] == '(') {
  9. $dp[$i] = ($i >= 2 ? $dp[$i - 2] : 0) + 2;
  10. ///右括号前边是右括号,并且除去前边的合法序列的前边是左括号
  11. } else if ($i - $dp[$i - 1] > 0 && $s[$i - $dp[$i - 1] - 1] == '(') {
  12. $dp[$i] = $dp[$i - 1] + (($i - $dp[$i - 1]) >= 2 ? $dp[$i - $dp[$i - 1] - 2] : 0) + 2;
  13. }
  14. $max = max($max, $dp[$i]);
  15. }
  16. }
  17. return $max;
  18. }
  19. //输入: ")()())"
  20. /*) start = 0;
  21. ( start = 1; stack->top = 1;
  22. ) max = 2;
  23. ( stack = 3;
  24. ) max = 4*/
  25. function longestValidParentheses1($s) {
  26. $res = 0;
  27. $start = 0;
  28. $stack = new SplStack();
  29. for ($i = 0; $i < strlen($s); $i++) {
  30. if ($s[$i] == '(') {
  31. $stack->push($i);
  32. } else {
  33. if ($stack->isEmpty()) {
  34. $start = $i + 1;
  35. } else {
  36. $stack->pop();
  37. $res = $stack->isEmpty() ? max($res, $i-$start+1):max($res, $i-$stack->top());
  38. }
  39. }
  40. }
  41. return $res;
  42. }
  43. }

GO代码实现:

  1. func longestValidParentheses(s string) int {
  2. stack := []int{}
  3. stack = append(stack, -1)
  4. max := 0
  5. for i, c := range s {
  6. if c == '(' {
  7. stack = append(stack, i)
  8. } else {
  9. stack = stack[:len(stack)-1] // 弹出栈顶元素
  10. if len(stack) == 0 {
  11. stack = append(stack, i)
  12. }
  13. // 当前元素的索引与栈顶元素作差,获取最近的括号匹配数
  14. max = Max(max, i - stack[len(stack)-1])
  15. }
  16. }
  17. return max
  18. }
  19. func Max(a, b int) int {
  20. if a > b {
  21. return a
  22. }
  23. return b
  24. }