题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
(1)左括号必须用相同类型的右括号闭合。
(2)左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例
代码
package zhan.demo;
import java.util.*;
//力扣 栈 20
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) { //有效字符串的长度必须为偶数 如果不是偶数就表明会有括号不匹配
return false;
}
//哈希映射的键为右括号,值为相同类型的左括号
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i); //将字符串类型转换为字符型
if (pairs.containsKey(ch)) {
//判断之前遍历s时候是否碰到现在满足if条件的右括号对应的左括号,并且对其进行进栈操作
//下面并列的第二个判断条件是之前进栈的栈顶左括号是否不等于,满足条件有括号在哈希表中的值表示的左括号
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty(); //判断最后栈中是否还是存在左括号
}
public static void main(String[] args){
String s = new String("()[]{}");
Solution sol = new Solution();
sol.isValid(s);
}
}
思路总结
1.首先判断字符串的长度,字符串的长度必须为偶数,因为符号的匹配问题必须是成对出现的括号,所以必须为偶数。
2.创建一个哈希映射,哈希映射的键为右括号,值表示左括号。并且向实例化的哈希集合对象添加三组键值对。
3.实例化一个栈对象。循环遍历输入的字符串 s, 每次执行一次遍历的时候使用charAt()方法将字符串对应索引的元素转换为字符型元素。接着执行条件判断,使用方法containKey( )判断每次执行遍历的字符型元素是否存在于哈希集合对象存放进去的键中,如果存在说明此时遍历的元素的是右括号,接着执行下一个判断,否则此时遍历的元素是左括号,将其放进栈中。
4.上面要执行接下来的判断条件是此时的栈是否为空,还有就是栈顶的元素是否不等于遍历元素在哈希集合中键对应的值,如果两个条件中满足一个,就返回false。条件语句执行完成后,执行出栈的操作,将左括号元素从栈中拿出,此时说明左括号和右括号匹配成功。继续执行下一个字符串元素的遍历,直到整个字符串元素执行完成。