leetcode第四天|leetcode第四天 : 有效的括号

有效的括号 题目描述
给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。
有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合
  2. 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true

示例 2:
输入: "()[]{}" 输出: true

示例 3:
输入: "(]" 输出: false

示例 4:
输入: "([)]" 输出: false

示例 5:
输入: "{[]}" 输出: true

思路
① 首先确定输入的字符串必定为空串或者是括号串
② 如果遇到空串直接返回true, 否则如果第一个括号是右单边括号, 直接返回false
③ 根据题意, 符合要求的括号串, 必定是成对出现, 否则不满足题意, 示例4是一种非常特殊的情况, 因为它虽然看起来是两对括号匹配的, 实际上在'[)'中已经被判为false, 违反了第二条规则
④ 把所有的左单边括号放在栈中, 如果遇到右单边括号, 则需弹出栈顶的左单边括号进行判断
⑤ 正确的顺序是指每次遇到右单边括号时, 都要与栈顶的左单边括号相匹配
⑥ 编程实现
例子
假设括号串为{}()({[]})
leetcode第四天|leetcode第四天 : 有效的括号
文章图片
有效的括号.png 编程
import java.util.Stack; /** * @author Jack * @date 2019-06-16-18:43 */ public class Solution {public static boolean isValid(String s) { //切割字符串, 分成一个个单边括号 String[] split = s.split(""); Stack stack = new Stack(); for (int i = 0; i <= split.length -1; i++){ //判断是否为左边括号 if(split[i].equals("{")||split[i].equals("[")||split[i].equals("(")){ stack.push(split[i]); continue; //第一个元素不是左单边括号 }else if(i == 0){ //如果为空串则返回真 if ("".equals(split[0])){ return true; //右单边括号 }else{ return false; } }else{ //判断最后一个元素是右单边括号且栈为空时, 不符合规则, 示例 : "()]" if(i == split.length-1 && stack.empty() && (split[i].equals("}")||split[i].equals("]")||split[i].equals(")"))){ return false; } //取出栈顶元素进行判断 if(!stack.empty()) { String pop = (String) stack.pop(); switch (split[i]){ case "}": if("{".equals(pop)){ //如果已经遍历到最后一个元素, 且匹配, 而且没有多余的左单边括号, 则返回true if(i == split.length -1 && stack.empty()) { return true; } continue; //与栈顶的左单边括号不匹配,返回false }else{ return false; } case "]": if("[".equals(pop)){ if(i == split.length -1 && stack.empty()){ return true; } continue; }else{ return false; } case ")": if("(".equals(pop)){ if(i == split.length -1 && stack.empty()){ return true; } continue; }else{ return false; } default: return false; } } } } return false; }public static void main(String[] args) { System.out.println(isValid("")); }}

总结
【leetcode第四天|leetcode第四天 : 有效的括号】说实话, 效率不堪一击, 内存还看得过去, 不过我还是不太懂内存消耗的影响因素是什么, 哈哈哈哈, 感觉自己做出来了就很不错了......看了别人的题解, 感觉自己写的弱爆了, 下面给出别人的简单解法, 太简洁了
class Solution { public boolean isValid(String s) { char[] array = s.toCharArray(); Stack stack = new Stack<>(); for (char c : array) { if (c =='(' || c =='[' || c =='{') { stack.push(c); }else if(stack.isEmpty()){ return false; }else if (c ==')' && stack.peek()=='(') { stack.pop(); } else if (c ==']' && stack.peek()=='[') { stack.pop(); } else if (c =='}' && stack.peek()=='{') { stack.pop(); }else{ return false; } } if(!stack.isEmpty()){ return false; } return true; } }作者:vicyas 链接:https://leetcode-cn.com/problems/two-sum/solution/zui-pu-tong-de-jie-fa-by-vicyas/ 来源:力扣(LeetCode)

    推荐阅读