题解 | #最长的括号子串# [P0-T1]

最长的括号子串

http://www.nowcoder.com/practice/45fd68024a4c4e97a8d6c45fc61dc6ad

栈上存目前未能pair的括号的下标

每遍历一个字符(下标i),check是否能和栈顶下标对应的字符pair,能pair就pop栈顶。
pop完后i与栈顶的差就是截止到i的valid子串长度。
  i.e. 此时栈顶下表对应再往前一个未能pair的字符
  
举例
0 1 2 3 4 5 6 7
( ( ) ( ( ) ( ) 

i         stack      len
0         0          0
1         0 1        0
2         0          2-0 = 2
3         0 3        0
4         0 3 4      0
5         0 3        5-3 = 2
6         0 3 6      0
7         0 3        7-3 = 4
import java.util.*;

public class Solution {
  public int longestValidParentheses (String s) {
    Deque<Integer> stack = new ArrayDeque<>();
    
    int maxLen = 0;
    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);
      
      if (c == ')' && 
          !stack.isEmpty() &&
          s.charAt(stack.peek()) == '(') {
        stack.pop();  // close 1 pair
        // need to check empty again after pop
        int curLen = i - (stack.isEmpty() ? -1 : stack.peek());
        maxLen = Math.max(maxLen, curLen);
        continue;
      } 
      
      // for all other cases, (i.e. can't form a pair), push idx
      stack.push(i);
    }
    
    return maxLen;
  }
}
全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务