算法-括号问题

1.判断括号有效

一般使用进行判断

(1)(),{},[]

使用一个栈
在这里插入图片描述

class Solution {
    public boolean isValid(String s) {
        //java中推荐使用Deque替代Stack,Deque堆栈操作方法:push()、pop()、peek()
        Deque<Character> stack=new LinkedList<>();
        char[] c=s.toCharArray();
        for(char ch:c){
            if(ch=='(' || ch=='{'|| ch=='['){
                stack.push(ch);
            }else{
                if(!stack.isEmpty() && charOf(ch)==stack.peek()){
                    stack.pop();
                }else{
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
    public char charOf(char ch){
        if(ch==')') return '(';
        if(ch=='}') return '{';
        return '[';
    }
}

(2)()加入*

使用两个栈
在这里插入图片描述

class Solution {
    public boolean checkValidString(String s) {
        int n=s.length();
        if(s==null || n==0){
            return true;
        }
        //使用两个栈分别存放(和*的位置下标
        //如果最后starStack的size大于等于leftStack的size并且迭代比较starStack和leftStack的栈顶元素
        //只有starStack大于等于leftStack的栈顶元素,返回true,否则返回false
        Deque<Integer> leftStack=new LinkedList<>();//存储'('的下标
        Deque<Integer> starStack=new LinkedList<>();//存储'*'的下标
        char[] charArr=s.toCharArray();

        for(int i=0;i<charArr.length;i++){
            if(charArr[i]=='('){
                leftStack.push(i);
            }else if(charArr[i]=='*'){
                starStack.push(i);
            }else{
                if(!leftStack.isEmpty()){
                    leftStack.pop();
                }else if(!starStack.isEmpty()){
                    starStack.pop();
                }else{
                    return false;
                }
            }
        }
        if(starStack.size()<leftStack.size()){
            return false;
        }
        while(leftStack.size()>0 && starStack.size()>0){
            if(starStack.peek()<leftStack.peek()){
                return false;
            }
            starStack.pop();
            leftStack.pop();
        }
        return true;
    }
}

2.括号生成

使用回溯
在这里插入图片描述

class Solution {
    List<String> res=new LinkedList<>();
    public List<String> generateParenthesis(int n) {
        if(n==0){
            return res;
        }
        StringBuilder sb=new StringBuilder();
        backTrack(n,n,sb);
        return res;
    }
    //向字符串中添加字符'('或者')',左括号剩余个数应该始终小于等于右括号剩余个数
    public void backTrack(int nLeft,int nRight,StringBuilder sb){
        if(nLeft==0 && nRight==0){
            res.add(new String(sb.toString()));
            return;
        }
        if(nLeft<0 || nRight<0){
            return;
        }
        if(nLeft>nRight){
            return;
        }
        sb.append('(');
        backTrack(nLeft-1,nRight,sb);
        sb.deleteCharAt(sb.length()-1);

        sb.append(')');
        backTrack(nLeft,nRight-1,sb);
        sb.deleteCharAt(sb.length()-1);
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值