一、题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 提示: 1 <= s.length <= 104 s 仅由括号 ‘()[]{}’ 组成
示例 1: 输入:s = “()” 输出:true
示例 2: 输入:s = “()[]{}” 输出:true
示例 3: 输入:s = “(]” 输出:false
示例 4: 输入:s = “([)]” 输出:false
示例 5: 输入:s = “{[]}” 输出:true
二、思路及图解(利用栈先进后出的规则实现)
- 假如输入是 [{]},每种括号的左右数量分别相等,但不是有效的括号。这是因为结果还与括号的位置有关。
- 对于有效的括号,它的部分子表达式仍然是有效的括号,比如 {()[()]} 是一个有效的括号,()[{}] 是有效的括号,[()] 也是有效的括号。并且当我们每次删除一个最小的括号对时,我们会逐渐将括号删除完。
2、图解
-
第1次遍历从字符串中获取第1个字符‘{’,入栈,如下图: -
第2次遍历从字符串中获取第2个字符‘(’,入栈,如下图: -
第3次遍历从字符串中获取第3个字符‘)’,与栈中栈顶的元素‘(’匹配,因此移出栈顶元素‘(’,如下图: -
第4次遍历从字符串中获取第4个字符‘[’,入栈,如下图: -
第5次遍历从字符串中获取第5个字符‘(’,入栈,如下图: -
第6次遍历从字符串中获取第6个字符‘)’,与栈中栈顶的元素‘(’匹配,因此移出栈顶元素‘(’,如下图: -
第7次遍历从字符串中获取第7个字符‘]’,与栈中栈顶的元素‘[’匹配,因此移出栈顶元素‘[’,如下图: -
第8次遍历从字符串中获取第8个字符‘}’,与栈中栈顶的元素‘{’匹配,因此移出栈顶元素‘[’,如下图: -
此时栈为空,返回true,否则返回flase。
三、题目代码解析(利用栈先进后出的规则实现)
1、代码
public class Test1 {
public static void main(String[] args) {
String str="{()[()]}";
boolean b=isValid(str);
System.out.println("字符串是否有效【"+b+"】");
}
public static boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> map =new HashMap<>();
map.put(')','(');
map.put(']','[');
map.put('}','{');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (map.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != map.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
}
2、结果如下图: 3、复杂度分析
- 时间复杂度:O(N)。遍历了一遍字符串。
- 空间复杂度:O(N)。最坏情况下,假如输入是 (((((((,栈的大小将是输入字符串的长度。
|