LeetCode-有效的括号

Posted EmacsDevinkin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-有效的括号相关的知识,希望对你有一定的参考价值。

LeetCode-有效的括号

1 Easy-有效的括号

1.1 题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

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

1.2 示例 1:

输入: "()"

输出: true

1.3 示例 2:

输入: "()[]{}"

输出: true

1.4 示例 3:

输入: "(]"

输出: false

1.5 示例 4:

输入: "([)]"

输出: false

1.6 示例 5:

输入: "{[]}"

输出: true

2 自己的答案

2.1 思路

  1. 首先排除不需要循环即可判断不是符合的字符串,例如
    • 空字符串
    • 字符串长度小于2(不能组成一对有效的括号)
    • 第一个字符是右括号的字符串
  2. 使用循环判断是否为有效字符串时,使用栈记录左括号的顺序,使用索引进行表示,并且索引是对称的(left和right变量,left[0]和right[0]为一对有效的括号,以此类推)
    • 当括号是左括号的时候,将左括号在left中对应的索引压入栈中
    • 当括号是右括号的时候,弹出栈vs中的一个值,该值为字符索引,通过该索引值与vs.pop(),栈弹出的值进行比较,如果不相等,不是有效的括号
  3. 注意的两个地方
    • 右括号的数量可能大于左括号的数量,所以在栈弹出值前要判断栈是否为空,空则直接返回为false,无效的括号
    • 如果左括号的值大于右括号的值,循环出来时候,需要判断栈是否为空,为空说明左括号数量和右括号数量相等,不为空是左括号数量大于右括号数量,返回false,,无效字符串

2.2 代码

package algorithm.easy;

import java.util.Stack;

public class ValidParentheses {
    public static boolean isVaild(String s) {
        String left = "([{";
        String right = ")]}";
        Stack<Integer> vs = new Stack<Integer>();
        boolean result = false;
        int leftPos = 0;
        int rightPos = 0;
        // 空字符串,返回true
        if (s.equals("")) {
            return true;
        }
        // 第一个字符串为空或字符串长度小于2或第一个字符是右括号,返回false
        if (s == null || s.length() < 2 || (right.indexOf(s.charAt(0)) != -1))
            return false;
        for (int i = 0; i < s.length(); i++) {
            // 如果该字符包含在左括号列表中,push到栈中
            leftPos = left.indexOf(s.charAt(i));
            if (leftPos != -1) {
                vs.push(leftPos);
            }
            // 如果该字符包含在右括号列表中,从栈中pop出来,并用来对比左括号与右括号的索引值是否相同
            rightPos = right.indexOf(s.charAt(i));
            if (rightPos != -1) {
                // 如果此时还是右括号,栈为空的话,说明右括号数量多于左括号数量,返回false
                if (vs.empty() || rightPos != vs.pop()) {
                    return false;
                }
            }
        }
        // 如果栈为空,返回true,否则返回false
        if (vs.empty()) {
            // 遍历均成功后,返回为有效字符串
            return true;
        } else {
            return false;
        }
    }
    public static void main(String[] args) {
        System.out.println(isVaild("()"));
        System.out.println(isVaild("()[]{}"));
        System.out.println(isVaild("(]"));
        System.out.println(isVaild("([)]"));
        System.out.println(isVaild("{[]}"));
    }
}

Date: 2018-10-28 23:07

Author: devinkin

Created: 2018-10-28 日 23:43

Validate

以上是关于LeetCode-有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----20. 有效的括号

LeetCode经典栈-有效的括号(难度:⭐)

leetcode20有效的括号

LeetCode 20. 有效的括号

leetcode 32.最长有效括号

LeetCode 32. 最长有效括号c++/java详细题解