LeedCode 之 Valid Parentheses

本文介绍了一种使用栈结构验证括号字符串是否有效的算法。通过遍历字符串并利用栈进行匹配,判断括号是否成对出现。提供了两种实现方式,一种直接使用栈,另一种用字符串模拟栈操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:Valid Parentheses
这又是一道很常见的题目,使用栈是最常见的解法,因为对在java中使用栈不够熟悉,参考了一下网上代码的编写
基本思路如下:
1、首先判断字符串的长度,如果为奇数个,那么肯定不是合格的括号字符串
2、如果为偶数个,则判断第一个括号是否为左半边的:’(‘,’[’ 或者 ‘{‘,如果是则将其压入栈,不是的话,直接返回false
2、接下来依次依次读取字符串中的括号,如果为左半边的括号,那么则压栈;不是的话就是看其与栈顶字符是否为一对括号;
3、如果是一对,那么栈顶字符出栈,继续循环;不是一对的话,就返回false
4、循环结束后,如果栈为空,则表示为合格的括号字符串,否则不合格,返回false
代码如下:

public class Solution {
 public boolean isValid(String s) {
         int len = s.length();
         Stack stack = new Stack();
         if(len%2 ==1)
             return false;
         else
         {
             if(s.charAt(0)=='('||s.charAt(0)=='['||s.charAt(0)=='{')
                    stack.push(s.charAt(0));
             else 
                 return false;
             for(int i=1;i<len;i++)
             {  
                     if(s.charAt(i)=='('||s.charAt(i)=='['||s.charAt(i)=='{')
                    stack.push(s.charAt(i));
                else
                {
                    Character peek = (Character)stack.peek();
                    if((peek=='('&&s.charAt(i)==')') || (peek=='['&&s.charAt(i)==']') ||(peek=='{'&&s.charAt(i)=='}'))
                        stack.pop();
                    else
                        return false;
                }
             }
         }
         return stack.isEmpty();
        }
}

更新于2017.10.22
重新做了一遍这道题,这次是自主完成的。
看到的第一想法依旧是使用栈的原理,但是不记得java中栈如何使用,所以利用新加一个字符串tmp来实现栈的原理,即当为左括号时,将其加入到tmp,如果不为,则判断下,和tmp尾部的字符是否可以配对,可以的话,就将尾部字符从tmp中去掉,并且长度减1,否则的话,否则直接返回 false。基本原理和上诉方法一是一致的,只是实现的过程不一样
代码如下:

public boolean isValid(String s) {
        int len = s.length();
        String tmp = "";
        int lentmp = 0;
        if(len%2==1)
            return false;
        if(s.charAt(0)==')'||s.charAt(0)=='}'||s.charAt(0)==']')
            return false;

        for(int i=0;i<len;i++){
            if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
                tmp += s.charAt(i);
                lentmp ++;
            }
            else {
                String sp = String.valueOf(tmp.charAt(lentmp-1))+String.valueOf(s.charAt(i));
                if(sp.equals("()")||sp.equals("{}")||sp.equals("[]")){
                    tmp = tmp.substring(0,lentmp - 1);
                    lentmp--;
                    }
                else
                {
                    return false;
                }
            }
        }
        if(lentmp==0){
            return true;}
        else{
            return false;
            }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值