package com.company.test.有效括号序列;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* @author xienl
* @description 有效括号序列
* @date 2022/5/17
*/
public class Solution {
public static void main(String[] args) {
String str = "([)]";
System.out.println(isValid2(str));
}
/**
* @param s string字符串
* @return bool布尔型
*/
public static boolean isValid(String s) {
int len = s.length();
// 如果说字符串不是偶数的话,那肯定不是一个有效的括号,就没有比较的必要了
if (s.isEmpty() || len % 2 != 0) {
return false;
}
// 初始化一个Hash表,用来记录所有可能发生的结果
Map<Character, Character> map = new HashMap<Character, Character>(len / 2) {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
Stack<Character> stack2 = new Stack<>();
// 把每一个字符放到栈里面去
for (char c : chars) {
stack.push(c);
}
while (!stack.isEmpty()) {
Character char1 = stack.pop();
if (!map.containsKey(char1)){
return false;
}
Character char2;
while (!stack.isEmpty() && !(char2 = stack.pop()).equals(map.get(char1))){
if (map.containsKey(char2)){
stack2.push(char1);
char1 = char2;
continue;
}
if (!char2.equals(map.get(char1))){
return false;
}
}
// 把第二个栈里面的元素再加回第一个栈中
while (!stack2.isEmpty()){
stack.push(stack2.pop());
}
}
return true;
}
/*** 题解答案
* @param s string字符串
* @return bool布尔型
*/
public static boolean isValid2(String s) {
int len = s.length();
// 如果说字符串不是偶数的话,那肯定不是一个有效的括号,就没有比较的必要了
if (s.isEmpty() || len % 2 != 0) {
return false;
}
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
for (char aChar : chars) {
if (aChar == '{' || aChar == '[' || aChar == '('){
stack.push(aChar);
continue;
}
if (stack.isEmpty() || !isMatch(aChar, stack.pop())){
return false;
}
}
return stack.isEmpty();
}
/**
* 括号是否匹配
* @return
*/
public static boolean isMatch(char char2, char char1){
if (char1 == '{'){
return char2 == '}';
}
if (char1 == '['){
return char2 == ']';
}
if (char1 == '('){
return char2 == ')';
}
return false;
}
/**
* 第一名的C++代码转Java代码
* @param s
* @return
*/
public static boolean isValid3(String s){
// write code here
Stack<Character> st = new Stack<>();
int n = s.length();
for(int i=0;i<n;i++){
if (!st.empty() && ((s.charAt(i) == ']' && st.peek()=='[') || ((s.charAt(i) == '}' && st.peek()=='{')|| ((s.charAt(i) == ')' && st.peek()=='('))))) {
st.pop();
} else {
st.push(s.charAt(i));
}
}
return st.empty();
}
}
牛客网:有效括号序列
最新推荐文章于 2025-12-02 21:20:38 发布
本文介绍了一种Java实现的方法,用于检查输入字符串中的括号是否构成有效序列。通过栈操作和映射表,展示了如何判断字符串如'([)]'的有效性。同时提供了三种不同的解决方案,包括使用HashMap、两个栈以及C++代码转换的Java实现。
418

被折叠的 条评论
为什么被折叠?



