【JAVA】每日练习——04

目录

一、 有效括号序列


一、 有效括号序列

给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

数据范围:字符串长度 0\le n \le 100000≤n≤10000

要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

示例:"()[]{}"  ---->true

解析:

1.考虑左右成对才是有效字符串,因此得出,当有奇数个括号时,不是合法括号序列

2.(引入栈stack,帮助来存储左括号)当输入括号为偶数个时,考虑输入为空的情况,没有输入,则return false;

3.当输入左括号时,入栈stack.push()

4.当输入右括号时,看当前栈stack是否为空,为空则说明没有左括号,第一个数就是右边括号,不是合法括号序列输出false;   若不为空则查看右括号是否与当前栈顶元素匹配(array[i]  ==  stack.peek()?),若不匹配,则退说明当前括号无法匹配(不合法),输出false,  退出循环;若匹配则弹出当前栈顶元素stack.pop(),此时继续便利输入的括号,重复上述操作。

5.遍历结束,此时若stack.isEmpty(),则说明栈中左括号全部成功匹配,return true,若栈不为空,说明此时左括号还有,没有全部匹配,return false.

以下两种代码都可实现:

方法一:

import java.util.*;

public class Solution {
    public boolean isValid (String s) {   
        Stack<Character> stack = new Stack<Character>();       
        char[] ch = s.toCharArray();    
        if(ch.length == 0) return false;
        else{
            if (ch.length % 2 == 1) {
                return false;
            }else {
                for (int i = 0; i < ch.length; i++) {
                    if (ch[i] == '(' || ch[i] == '[' || ch[i] == '{') {   //如果  是左括号  则入栈
                        stack.push(ch[i]);
                    }else {    //如果  是右括号  则出栈  (判断栈是否为空)
                        if(stack.isEmpty()) {
                            return false;
                        }else {
                            switch (stack.pop()) {
                                case '{':
                                    if (ch[i] !='}')  return false;break;
                                case '[':
                                    if (ch[i] !=']')  return false;break;
                                case '(':
                                    if (ch[i] !=')')  return false;break;        
                            }      
                        }
                    }           
                } 
                if(stack.isEmpty()) {
                    return true;
                }else {
                     return false;
                }
            }
        }  
    }
}

方法二:

  public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();  //给定一个栈用来存放字符
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);  //将输入字符串s转换为字符
            if (ch == '(' || ch == '[' || ch =='{') {  //判断是否为左括号,是的话写入栈
                stack.push(ch);
            }else {  //遇到右括号  查看匹配
                if (stack.empty()) {
                    System.out.println("右括号多");
                    return false;
                }
                char top = stack.peek();  //获取栈顶元素 是否有与之对应的括号  哪个左括号
                if (top == '{' && ch =='}' || top == '[' && ch ==']' ||
                    top == '(' && ch ==')') {
                    stack.pop();
                }else {
                    System.out.println("左右括号不匹配");
                    return false;
                }
            }
        }
        if (!stack.empty()) {
            System.out.println("左括号多");
            return false;
        }
        return true;
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值