原题描述

原题链接

给定一个只包括'(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()” 输出:true

示例 2:

输入:s = “()[]{}” 输出:true

示例 3:

输入:s = “(]” 输出:false

示例 4:

输入:s = “([)]” 输出:false

示例 5:

输入:s = “{[]}” 输出:true

提示:

1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

个人解法

Java

  1. public boolean isValid(String s) {
  2. char[] chars = s.toCharArray();
  3. int len = chars.length, n;
  4. if (len<=1){
  5. return false;
  6. }
  7. Integer[] ints = new Integer[len];
  8. for (int i = 0; i < len; i++) {
  9. ints[i] = 0 + chars[i];
  10. }
  11. Stack<Integer> st = new Stack<Integer>();
  12. for (int i = 0; i < len; i++) {
  13. if (ints[i] == 40 || ints[i] == 91 || ints[i] == 123) {
  14. st.push(ints[i]);
  15. } else {
  16. if (st.empty()){
  17. return false;
  18. }else {
  19. n = st.pop();
  20. if (n - ints[i] != -1 && n - ints[i] != -2) {
  21. return false;
  22. }
  23. }
  24. }
  25. }
  26. if (!st.empty()){
  27. return false;
  28. }
  29. return true;
  30. }

JavaScript

  1. /*
  2. * @lc app=leetcode.cn id=20 lang=javascript
  3. *
  4. * [20] 有效的括号
  5. */
  6. // @lc code=start
  7. var check = function (stack, origin) {
  8. if (stack[stack.length - 1] === '(') {
  9. return origin === ')'
  10. } else if (stack[stack.length - 1] === '{') {
  11. return origin === '}';
  12. } else if (stack[stack.length - 1] === '[') {
  13. return origin === ']';
  14. }
  15. }
  16. /**
  17. * @param {string} s
  18. * @return {boolean}
  19. */
  20. var isValid = function (s) {
  21. const stack = [];
  22. stack.push(s[0]);
  23. for (let i = 1; i < s.length; i++) {
  24. if (check(stack, s[i])) {
  25. stack.pop();
  26. } else {
  27. stack.push(s[i]);
  28. }
  29. }
  30. return stack.length === 0;
  31. };
  32. // @lc code=end

更优解法

Java

  1. public boolean isValid(String s) {
  2. Stack<Character> stack=new Stack<>();
  3. for(int i=0;i<s.length();i++){
  4. char c=s.charAt(i);
  5. if(c=='('||c=='['||c=='{'){stack.push(c);}
  6. else if(stack.isEmpty()||c==')'&&stack.pop()!='('||c==']'&&stack.pop()!='['||c=='}'&&stack.pop()!='{'){return false;}
  7. }
  8. return stack.isEmpty();
  9. }

JavaScript

更优解法链接

判断匹配 使用了 map

  1. var isValid = function(s) {
  2. const n = s.length;
  3. if (n % 2 === 1) {
  4. return false;
  5. }
  6. const pairs = new Map([
  7. [')', '('],
  8. [']', '['],
  9. ['}', '{']
  10. ]);
  11. const stk = [];
  12. for (let ch of s){
  13. if (pairs.has(ch)) {
  14. if (!stk.length || stk[stk.length - 1] !== pairs.get(ch)) {
  15. return false;
  16. }
  17. stk.pop();
  18. }
  19. else {
  20. stk.push(ch);
  21. }
  22. };
  23. return !stk.length;
  24. };