Leetcode-20有效的括号(java实现)
题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
1. 左括号必须用相同类型的右括号闭合。
2. 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
分析:
- 括号是有key-value 关系的
- 括号的关闭顺序是打开顺序的逆序,如(【】)
- 空字符串是有效的括号,则说明我们需要注意判空处理
- 综上所述:我们利用栈就行完成
- key-value关系
- 关闭顺序是打开顺序的逆序
我们利用java中的LinkedList当作集合容器,通过代码理解一下栈的思想。
解答:
package com.yang.leetcode.classic;
import java.util.LinkedList;
/**
* @author: fudy
* @date: 2020/9/14 上午 08:31
* @Decription: leetcode—No20 =(有效括号)
**/
public class ValidBrackets {
public static void main(String[] args) {
// 测试
System.out.println(isValid("(){()}{[()]}}"));
System.out.println(isValid("(){()}{[()]}"));
System.out.println(isValid("((([]{})))"));
System.out.println(isValid(""));
}
private static boolean isValid(String s){
// 使用链表完成类似与栈的数据结构
LinkedList<Character> linkedList = new LinkedList<Character>();
// 如果字符串为空跳过循环
for (char c : s.toCharArray()) {
// 如果是左符号,则压入栈右符号,保证key-value关系
if (c == '{') linkedList.push('}');
else if (c == '[') linkedList.push(']');
else if (c == '(') linkedList.push(')');
// 如果不是左符号,则判断是不是右括号,因为有顺序性我们必须出栈的右符号和我们栈顶的右符号相等
// 如果链表为空,则左符号少了,如果不相等,则符号交叉
else if (linkedList.isEmpty() || c != linkedList.pop()) return false;
}
// 如果链表还存在值,则右符号少了
// 如果链表为空说明 1.这个字符串是有效的括号 2.这个字符串为空
return linkedList.isEmpty();
}
}