给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
java代码如下:
class Solution {
public boolean isValid(String s){//输入字符串s
int n = s.length();//用n记录s的长度
if(n%2 != 0){//如果长度不为偶数,则一定不匹配,返回false
return false;
}
//因为从左向右扫描,遇到右括号向左边找匹配的括号,所以键为右括号,值为左括号。
Map<Character,Character> map = new HashMap<Character,Character>(){{
put(')','(');
put('}','{');
put(']','[');
}};
//因为先输入的后匹配,所以采用栈这种存储结构
Deque<Character> stack = new LinkedList<Character>();
//遍历S中的每个元素,用charAt取出每个i所对应的字符串中的字符
for(int i = 0;i<n;i++){
char ch = s.charAt(i);
//如果该元素和map中的键有对应的话
if(map.containsKey(ch)){
//若栈为空/栈顶元素和该元素不一样,则不匹配返回false
if(stack.isEmpty()||stack.peek()!=map.get(ch)){
return false;
}
//否则弹出栈顶元素(即ch对应的map值等于栈顶元素,匹配)
else{
stack.pop();
}
}
//map中无和ch匹配的键,则将ch压栈
else{
stack.push(ch);
}
}
//遍历完后若stack为空,则全部匹配,返回true
return stack.isEmpty();
}
}