一【题目类别】
- 栈
二【题目难度】
- 简单
三【题目编号】
- 20.有效的括号
四【题目描述】
- 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串s,判断字符串是否有效。
- 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
五【题目示例】
- 示例 1:
输入:s = “()”
输出:true - 示例 2:
输入:s = “()[]{}”
输出:true - 示例 3:
输入:s = “(]”
输出:false - 示例 4:
输入:s = “([)]”
输出:false - 示例 5:
输入:s = “{[]}”
输出:true
六【题目提示】
- 1 < = s . l e n g t h < = 1 0 4 1<=s.length<=10^4 1<=s.length<=104
- s仅由括号 ‘()[]{}’ 组成
七【解题思路】
- 利用栈,遇到左括号将匹配的右括号入栈,遇到右括号匹配当前出栈值,因为有效括号细分最小就是左右匹配
八【时间频度】
- 时间复杂度: O ( N ) O(N) O(N)
九【代码实现】
- Java语言版
package Stack;
import java.util.Stack;
public class p20_ValidParentheses {
public static void main(String[] args) {
String s = "([)]";
boolean res = isValid(s);
System.out.println("res = " + res);
}
public static boolean isValid(String s) {
// 新建一个栈
Stack<Character> stack = new Stack<Character>();
// 利用栈先进先出的特性,传入一个字符,他反向对应的字符压入栈,当所有的左边字符都遍历完之后,每个字符反向对应的字符都已入栈
// 这个时候还在继续遍历字符串,也开始从栈中弹出元素,如果这个时候弹出的元素正好和遍历到的字符串相等,则说明这个括号有效
// 因为当前这个字符最后进来的,和它反向对应的字符在栈顶,依次遍历下去,如果最后所有元素都弹出,栈空,说明所有括号都有效
for (char c : s.toCharArray()) {
if (c == '(') {
stack.push(')');
} else if (c == '{') {
stack.push('}');
} else if (c == '[') {
stack.push(']');
} else if (stack.isEmpty() || c != stack.pop()) {
return false;
}
}
return stack.isEmpty();
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
/*使用数组模拟栈*/
#define MAX_COUNT 10000
char p20stack[MAX_COUNT] = { 0 };
int p20stack_top = 0;
/*初始化栈*/
void p20stack_init()
{
p20stack_top = 0;
memset(p20stack, 0, sizeof(p20stack));
}
/*入栈*/
void p20stack_push(char c)
{
p20stack[p20stack_top++] = c;
}
/*出栈*/
char p20stack_pop()
{
char c = p20stack[p20stack_top - 1];
p20stack[--p20stack_top] = 0;
return c;
}
/*判断栈是否为空*/
bool p20stack_empty()
{
if (p20stack_top <= 0)
{
return true;
}
return false;
}
/*判断括号是否有效*/
bool isValid(char * s)
{
/*初始化栈*/
p20stack_init();
/*利用栈先进先出的特性,传入一个字符,他反向对应的字符压入栈,当所有的左边字符都遍历完之后,每个字符反向对应的字符都已入栈*/
/*这个时候还在继续遍历字符串,也开始从栈中弹出元素,如果这个时候弹出的元素正好和遍历到的字符串相等,则说明这个括号有效*/
/*因为当前这个字符最后进来的,和它反向对应的字符在栈顶,依次遍历下去,如果最后所有元素都弹出,栈空,说明所有括号都有效*/
for (int i = 0; s[i]; i++)
{
if (s[i] == '(')
{
p20stack_push(')');
}
else if (s[i] == '{')
{
p20stack_push('}');
}
else if (s[i] == '[')
{
p20stack_push(']');
}
else if (p20stack_empty() || s[i] != p20stack_pop())
{
return false;
}
}
return p20stack_empty();
}
int main(void)
{
/*主函数省略*/
}
十【提交结果】
-
Java语言版
-
C语言版