给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串,判断该字符串是否有效。
有效字符串需满足:
(1)左括号必须用相同类型的右括号闭合。
(2)左括号必须以正确的顺序闭合。
比如 “()”、“()[]{}”、“{[]}” 都是有效字符串,而 “(]” 、“([)]” 则不是。
我们可以利用栈 Stack 来解决这个问题。
(1)首先我们将括号间的对应规则存放在 Map 中;
(2)创建一个栈。遍历字符串,如果字符是左括号就直接加入stack中,否则将stack 的栈顶元素与这个括号做比较,如果不相等就直接返回 false。遍历结束,如果stack为空,返回 true。
public class Test {
public static void main(String[] args) {
System.out.println("()[]{} 符号是否成对出现:" + isValid("()[]{}"));
System.out.println("{[]} 符号是否成对出现:" + isValid("{[]}"));
System.out.println("(] 符号是否成对出现:" + isValid("(]"));
System.out.println("([)] 符号是否成对出现:" + isValid("([)]"));
}
public static boolean isValid(String s){
// 括号之间的对应规则
HashMap<Character, Character> mappings = new HashMap<Character, Character>();
mappings.put(')', '(');
mappings.put('}', '{');
mappings.put(']', '[');
Stack<Character> stack = new Stack<Character>();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
/**
* 如果字符不是右半部分(是左半部分)则压入栈中
*/
if (mappings.containsKey(chars[i])) {
char topElement = stack.empty() ? '#' : stack.pop();
/**
* 将当前字符与栈顶进行比较
*/
if (topElement != mappings.get(chars[i])) {
return false;
}
} else {
stack.push(chars[i]);
}
}
return stack.isEmpty();
}
}
输出结果为:
()[]{
} 符号是否成对出现:true
{
[]} 符号是否成对出现:true
(] 符号是否成对出现:false
([)] 符号是否成对出现:false