前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法:有效括号

算法:有效括号

作者头像
Fisherman渔夫
发布2019-07-31 14:49:07
4050
发布2019-07-31 14:49:07
举报
文章被收录于专栏:渔夫渔夫

版权声明: https://blog.csdn.net/li_xunhuan/article/details/90140416

问题描述:

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

有效字符串需满足:

代码语言:javascript
复制
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:

输入: “()” 输出: true

示例 2:

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

示例 3:

输入: “(]” 输出: false

示例 4:

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

示例 5:

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

方案1:

我们用一个堆栈来实现,若发现是左括号之一,压入堆栈;发现是右括号之一,那么弹出上一个堆栈值,除非弹出括号是与当前右括号对应的左括号,那么必然是括号不对; 这样我们还要考虑一个问题,如果左括号比右括号多怎么办,但是存在着的右括号和左括号都是匹配的,那么我们考虑到,堆栈的弹出左括号操作必然会有造成栈元素减少,所以我们利用堆栈元素空不空来最后把关,是否完全匹配

时间复杂度,空间复杂度:均为O(n)

代码语言:javascript
复制
代码1:
class Solution {
public boolean isValid(String s) {
    if(s==null){
        return false;
    }
    int length=s.length();
    if(length==0)
        return true;

Stack stack = new Stack<>();

代码语言:javascript
复制
for(int i=0;i<length;i++){
    char charTemp=s.charAt(i);
    if(charTemp=='{'||charTemp=='['||charTemp=='('){
        stack.push(charTemp);
    }else{
        if(stack.empty())
            return false;
        char charcurr = stack.pop();
        if((charTemp=='}'&&charcurr!='{')||(charTemp==']'&&charcurr!='[')||(charTemp==')'&&charcurr!='('))
    return false;    
    }

}
if(stack.empty())
return true;    
   return false;
}
}

方案2:

我们发现使用Java语法中的Stack结构可以解决这个问题,那么问题来了,我们何不用简单的数组实现这个问题,只要设置一个top指针(Java中没有指针,但是类似于C中的作用,所以命名为指针),使top始终指向堆栈顶元素,并且自定义数组实现堆栈的压入push以及弹出操作pop 时间复杂度,空间复杂度:均为O(n)

代码语言:javascript
复制
代码2:
class Solution {
public boolean isValid(String s) {
    if(s==null){
        return false;
    }
    int length=s.length();
    if(length==0)
        return true;
    char[] stack=new char[length];
    int top=-1;
for(int i=0;i<length;i++){
    char charTemp=s.charAt(i);
    if(charTemp=='{'||charTemp=='['||charTemp=='('){
        ++top;
        stack[top]=charTemp;
        
    }else{
        if(top==-1)
            return false;
        char charcurr = stack[top];
        top--;
        if((charTemp=='}'&&charcurr!='{')||(charTemp==']'&&charcurr!='[')||(charTemp==')'&&charcurr!='('))
    return false;    
    }

}
if(top==-1)
return true;    
   return false;
}
}

方案3:

我们发现如果数组用不了这么大,这样造成了空间的极大浪费,所以我们用ArrayList对方案2中的数组数据结构进行优化: 时间复杂度,空间复杂度:均为O(n)

实际上这个运行时间并不比方案2简单,原因暂时未知

代码3:

代码语言:javascript
复制
class Solution {
public boolean isValid(String s) {
    if(s==null){
        return false;
    }
    int length=s.length();
    if(length==0)
        return true;
    List<Character> stack= new ArrayList<>();
for(int i=0;i<length;i++){
    char charTemp=s.charAt(i);
    if(charTemp=='{'||charTemp=='['||charTemp=='('){
      stack.add(charTemp);
    }else{
        if(stack.isEmpty())
            return false;
        char charcurr = stack.remove(stack.size()-1);
        if((charTemp=='}'&&charcurr!='{')||(charTemp==']'&&charcurr!='[')||(charTemp==')'&&charcurr!='('))
    return false;    
    }

}
if(stack.isEmpty())
return true;    
   return false;
}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述:
  • 方案1:
  • 方案2:
  • 方案3:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档