讨论/题目交流/对于力扣第 20 题的分享,共同探讨。/
对于力扣第 20 题的分享,共同探讨。

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。

力扣 20 题

想法:

就是根据栈操作,如果是左括号,就入栈。右括号就从栈顶匹配,只要不符合规则(什么样的右括号就匹配什么样的左括号)就返回。
代码如下,有不足的希望可以指正,然后共同学习吧。也是刚开始入门力扣。

class Solution {
    public boolean isValid(String s) {
        char[] c =s.toCharArray();
		List<Character> list = new ArrayList();
		
		for (Character d : c) {
			
			switch (d) {
			case '{':
			case '[':
			case '(':
				list.add(d);
				break;
			case '}':
				if (list.size() - 1 >= 0 && list.get(list.size() - 1) == '{') {
					list.remove(list.size() - 1);
				} else 
					return false ;
				break;
			case ']' :
				if (list.size() - 1 >= 0 && list.get(list.size() - 1) == '[') {
					list.remove(list.size() - 1);
				} else 
					return false ;
				break;
			case ')' :
				if (list.size() - 1 >= 0 && list.get(list.size() - 1) == '(') {
					list.remove(list.size() - 1);
				} else 
					return false ;
				break;
			default:
				break;
			}
		}
		return list.size() == 0 ? true : false;
        }
    }
}


展开讨论
共 2 个讨论

我提几点建议,仅供参考哈。

1、首先我觉得代码格式是一个大问题,我个人比较看重代码格式、缩进、变量和方法的命名,我想多半是复制、粘贴的原因;

2、既然你提到用栈了,就使用 Java 带的 Stack 对象好了,即使用 ArrayList 对象也可以命名为 stack 啊,Stack 对象里面有更符合栈语义的接口 push()isEmpty()peek()pop(),就不会写得像 list.remove(list.size() - 1); 这么冗长了;

3、list.size() == 0 本身就是一个布尔表达式,直接返回这个表达式即可;

4、下面这种语法,建议在 case 语句里面复制 list.add(d); break; 知道的会懂即使前两个分支走到了,也会执行这两句,使用别的语言的小伙伴看到了可能会奇怪这两行放在这里什么都不写

case '{':
case '[':
case '(':
    list.add(d);
    break;

我个人觉得代码在不影响性能的前提下还是语义优先;

5、这道题比较烦的一点是代码写得会比较长,但是如果注意到,遇到 {([,分别向栈里存它们匹配的对象 })] ,弹出的时候就可以直接比较它们是否相等了,即 switch 部分的代码可以是这样的:

switch (c) {
    case '(':
        stack.push(')');
        break;
    case '[':
        stack.push(']');
        break;
    case '{':
        stack.push('}');
        break;
    default:
        if (stack.isEmpty() || stack.pop() != c) {
            return false;
        }
        break;
}

仅供参考哈,当然也可能有不对的地方,欢迎指出。

2

你很强