算法:有效的括号

题目要求:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
代码实现:

class Solution {
	static char[] left = new char[]{'(','{','['};
    	static char[] right = new char[]{')','}',']'};
	public static boolean isValid(String s) {
        	if(s == null) return true;
        	if(s.length()%2 != 0) return false;
       		LinkedList<Character> list = new LinkedList<>();
	        for(char c :s.toCharArray()) {
	            if(isLeft(c)) {
	                list.add(c);
	            } else if(isRight(c)) {
	                if(list.size() < 1) return false;
	                if(isRightTrue(list.get(list.size()-1), c)) list.remove(list.size()-1);
	                else return false;
	            } else {
	                return false;
	            }
	        }
        	if(list.size() == 0) return true;
       		 return false;
    }
    /**
    * 判断字符是否是一个左括号
    */
     private static boolean isLeft(char leftc) {
        for (int i = 0; i < left.length; i++) {
            if(left[i] == leftc) return true;
        }
        return false;
    }
     /**
    * 判断字符是否是一个右括号
    */
    private static boolean isRight(char rightc) {
        for (int i = 0; i < right.length; i++) {
            if(right[i] == rightc) return true;
        }
        return false;
    }
     /**
    * 判断2个字符是否是一个完整的括号
    */
    public static boolean isRightTrue(char leftc, char rightc) {
        char[] left = new char[]{'(','{','[',};
        char[] right = new char[]{')','}',']'};
        for (int i = 0; i < left.length; i++) {
            if(left[i] == leftc && right[i] == rightc) return true;
        }
        return false;
    }
}

解题思路:
1.先做一个初略的判断,如果字符串为有效的括号,则字符串的长度一定是偶数或者0,例如:“” || “[]” || “{[()]}”;
所以:if(s.length()%2 != 0) return false;
2.分析有效括号的结构
1>一个有效括号的构成必然由一个左括号和一个右括号构成,所以我把数据分成leftChar和rightChar;
2>最后添加的leftChar必然被最先消费,及最后添加的leftChar必然背下一个rightChar所消费;
例如: {[]},{[][]},[()({})]

这一期的算法就到这里了,感谢您的阅读,如果您有更加效率的解决办法或者不一样的思路都可以给我留言,我们一同成长!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值