2020秋招笔试—有效字符串

2020秋招笔试—有效字符串

题目

输入一串字符串,只包含’(’ , ‘)’ , ‘[’ , ‘]’ , ‘{’ , ‘}’ 这六种字符,现要判断字符串是否有效。有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

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

思路

  1. 用栈解决即可,遍历字符串,每次遇到左括号就入栈,遇到右括号则出栈到栈顶弹出对应的左括号;
  2. 当最终遍历完成后,若栈不为空,则为false;栈为空,则为true。

代码

个人代码

public boolean solute(String str){
    if(str==null||str.length()==0)
        return true;
    Stack<Character> stack = new Stack<>();
    char[] chars = str.toCharArray();
    for(char c:chars){
        if(c=='('||c=='{'||c=='[')
            stack.push(c);
        else {
            if(stack.isEmpty()) return false;
            else if(c==')'){
                while (stack.peek()!='('){
                    if(!stack.isEmpty()){
                        stack.pop();
                    }
                    else
                        return false;
                }
                stack.pop();
            }
            else if(c==']'){
                while (stack.peek()!='['){
                    if(!stack.isEmpty()){
                        stack.pop();
                    }
                    else
                        return false;
                }
                stack.pop();
            }
            else if(c=='}'){
                while (stack.peek()!='{'){
                    if(!stack.isEmpty()){
                        stack.pop();
                    }
                    else
                        return false;
                }
                stack.pop();
            }
        }
    }
    return stack.isEmpty();
}

这个代码只有80%的通过率,暂时不知道原因。

LeetCode题解

public boolean solute4(String str){
    int len = str.length();
    char[] stack = new char[len];
    int p = -1;
    for(char c: str.toCharArray()){
        //如果遇到对应的字符则出栈
        if(p>=0&&stack[p]==c){
            stack[p] = '\0';
            p--;
        }
        else{
        //入栈操作
            p++;
            if(c == '(')
                stack[p] = ')';
            else if(c == '[')
                stack[p] = ']';
            else if(c == '{')
                stack[p] = '}';
        }
    }
    if (p>=0)
        return false;
    return true;
}

该题解使用数组来替代栈的操作,每当遇到左括号时就将对应右括号入栈,然后如果遇到右括号且栈顶元素与该右括号相同则出栈,否则栈顶指针+1。但是这个写法无法通过全部的示例,因为它只是将索引减小,但不对数组内的元素进行弹出操作,因此当示例为 “()))" 的形式时,会返回 true ,但结果是显而易见的 false。因此将其改回stack或者添加弹出操作。

数组形式:弹出之后清除索引数据

public boolean isValid(String s) {
    int len = s.length();
    char[] stack = new char[len];
    int p = -1;
    for(char c:s.toCharArray()){
        if(p>=0&&stack[p]==c){
            //弹出之后要清除数据
            stack[p] = '\0';
            p--;
        }
        else {
            p++;
            //如果符号不符则只索引+1但不引入字符,
            //从而保证不会被清空,输出false
            if(c=='(')
                stack[p] = ')';
            else if(c=='{')
                stack[p] = '}';
            else if(c=='[')
                stack[p] = ']';
        }
    }
    return p>=0?false:true;
}

用栈实现:

public boolean isValid2(String s) {
    Stack<Character> stack = new Stack<>();
    //防止出现空栈错误
    stack.push('0');
    for(char c:s.toCharArray()){
        if(stack.peek()==c){
            stack.pop();
        }
        else {
            if(c=='(')
                stack.push(')');
            else if(c=='{')
                stack.push('}');
            else if(c=='[')
                stack.push(']');
            //不符合的就填入不可能被清空的值
            else
                stack.push('0');
        }
    }
    //弹出初始的栈顶元素‘0’
    stack.pop();
    return stack.isEmpty();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值