一、题目描述
1.题目内容
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
另外两个条件比较好理解,这里说一下第二条,此条件是指不同类型的左括号哪个在后,哪个就应该先闭合,也就是对应右括号应该先出现。比如字符串s= { [ } ]就不是一个有效的字符串,因为中括号[应该先闭合,即]应该在}的前面。
2.样例
二、解决方案
这道题主要涉及的知识点是:栈结构
栈的特点:先进后出
1.算法流程
这种题直观解决方案就是使用栈结构,具体实现我们需要考虑综合的边界条件。
具体地,算法流程如下:
- 判断字符串长度是否为偶数,如果是奇数说明字符串无效,直接返回false(因为所有括号左右一一对应,所以有效字符串的基础条件就是len(s)%2=0);
- 创建不同类型括号对之间的映射关系,如’[‘与’]'对应(Java中使用Map实现);
- 初始化栈,用于后续左括号入栈,完成判断过程;
- 从头遍历输入字符串:
(1)判断栈是否为空,若为空,则直接将当前字符入栈;
(2)判断栈顶元素是否为右括号,若为右括号说明字符串无效,跳出循环,此时栈一定不为空(起码会包含一个右括号);
(3)判断栈顶元素topChar是否和字符串中当前字符currentChar是否配对闭合:1)如果配对,则栈顶元素出栈;2)如果不配对,则将当前字符入栈;3)字符串指针后移一位; - 遍历结束以后,判断栈是否为空,若栈为空则说明输入字符串中的左右括号一一对应,字符串有效;
分别举一个有效字符串、无效字符串例子,展示其判断过程:
(1)有效字符串:()[]
(2)无效字符串:[{]}
2.Java代码
1)核心代码
public boolean isValid(String s) {
int len=s.length();
// 判断字符串长度是否为偶数
if (len%2!=0){
return false;
}
// 创建括号对之间的映射关系,便于遍历字符串时的闭合判断
Map<Character,Character> bracketsRelation = new HashMap<Character,Character>();
bracketsRelation.put('{','}');
bracketsRelation.put('(',')');
bracketsRelation.put('[',']');
// 借助栈结构完成判断过程
Stack<Character> strStack=new Stack<Character>();
int i=0; // 指向字符串中的元素,用于遍历字符串
while (i<len){
char currentChar = s.charAt(i); // 获取当前字符
if (strStack.isEmpty()){ // 用于第一次入栈,以及后续括号配对导致空栈的情况
strStack.push(currentChar);
i++;
continue;
}
char topChar=strStack.peek(); // 获取栈顶元素
if(topChar==')'||topChar=='}'||topChar==']'){ //如果栈顶元素为右括号则说明字符串无效
break;
}
// 判断当前字符是否与栈顶元素配对
if (currentChar!=bracketsRelation.get(topChar)) {
strStack.push(currentChar);
}else {
strStack.pop();
}
i++;
}
// 若栈为空则说明字符串有效,反之字符串无效
return strStack.isEmpty();
}
2)完整测试代码
package com.north.leetcode;
/*
* LeetCode20:有效的括号
* */
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class ValidParentheses {
public static void main(String[] args) {
// String s= "()[]{}";
// String s= "()";
// String s= "(]";
// String s= "{[]}";
String s= "([)]";
System.out.println(new Solution1().isValid(s));
}
}
class Solution1 {
public boolean isValid(String s) {
int len=s.length();
if (len%2!=0){
return false;
}
Map<Character,Character> bracketsRelation = new HashMap<Character,Character>();
bracketsRelation.put('{','}');
bracketsRelation.put('(',')');
bracketsRelation.put('[',']');
Stack<Character> strStack=new Stack<Character>();
int i=0;
while (i<len){
char currentChar = s.charAt(i);
if (strStack.isEmpty()){
strStack.push(currentChar);
i++;
continue;
}
char topChar=strStack.peek();
if(topChar==')'||topChar=='}'||topChar==']'){
break;
}
if (currentChar!=bracketsRelation.get(topChar)) {
strStack.push(currentChar);
}else {
strStack.pop();
}
i++;
}
return strStack.isEmpty();
}
}