题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
思路:
利用栈先进后出的原理,判断右括号与栈顶元素是否匹配,不匹配直接返回false
(1)将 ) ] } 分别作为key 放入map中
(2)遍历字符串,如果当前元素为右括号,弹出栈顶元素,判断栈顶元素是否匹配,不匹配直接返回false
(3)如果当前元素为左括号,将括号放入栈中
(4)判断栈是否为空
代码实现
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
class StringValid {
public static void main(String[] args) {
String s = "){}[]";
boolean result = isValid(s);
System.out.println(result);
}
/**
* 判断是否是有效的字符串
*
* 思路:利用栈先进后出的思想,遍历字符数组,将} ] ),作为map的key,value是对应括号,
* 如果有 } ] ) 与当前栈顶元素做比较,
* 如果对应相匹配的直接出栈,不匹配直接返回false,如果没有} ] ),将元素放入栈中,
* 最后判断栈是否为null
* @param s
* @return
*/
public static boolean isValid(String s) {
// 将符号放入map中
Map<Character,Character> map = new HashMap<>();
map.put(')','(');
map.put('}','{');
map.put(']','[');
Stack<Character> stack = new Stack<>();
for(int i = 0; i < s.length(); i ++){
char ch = s.charAt(i);
// 如果有右括号判断是否配对
if(map.containsKey(ch)){
// 找到栈顶元素
char stackTop = stack.empty() ? '#' : stack.pop();
if(stackTop != map.get(ch)){
return false;
}
}else {
// 没有右括号直接放进栈里
stack.push(ch);
}
}
return stack.isEmpty();
}
}