问题描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
原因分析:
困扰点一:
例如:关于接口类实例化的理解:
-
new LinkedList<Character>()
:在堆内存中创建一个LinkedList
对象。这个对象是LinkedList
类的一个实例。 -
Deque<Character> stack
:声明一个引用变量stack
,它的类型是Deque
接口。这意味着这个变量可以指向任何实现了Deque
接口的类的对象。 -
将
stack
变量指向刚刚创建的LinkedList
对象。因为LinkedList
实现了Deque
接口,所以这是允许的。
new LinkedList的意义在哪里?
new LinkedList()
的意义在于创建一个具体的、实现了Deque
接口的LinkedList
对象。虽然我们通过Deque
接口的引用来操作这个对象,但实际在内存中的对象是LinkedList
类型的。- 这样做的好处是:我们可以利用多态性。我们可以在不改变使用
Deque
接口的代码的情况下,更换具体的实现类。比如,我们可以将new LinkedList<>()
改为new ArrayDeque<>()
,而使用stack
的代码不需要改变。
困扰点二:
java
for (char c : s.toCharArray()) {
// 循环体
}
/*
for (元素类型 临时变量 : 集合或数组) {
// 使用临时变量
}
String s = "hello";
char[] chars = s.toCharArray();
// 结果:['h','e','l','l','o']
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
// 循环体
}*/
解决方案:
java
class Solution {
public boolean isValid(String s) {
if(s.length() % 2 != 0)
return false;
Deque<Character> stack =new ArrayDeque<Character>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c =='(' ||c == '[' || c == '{'){
stack .push(c);
}else{
if(stack.isEmpty())return false;
char top = stack.pop();
if (c == ')' && top != '(') return false;
if (c == ']' && top != '[') return false;
if (c == '}' && top != '{') return false;
}
}
return stack.isEmpty();
}
}
```