【LeetCode每日一题】——20.有效的括号

一【题目类别】

二【题目难度】

  • 简单

三【题目编号】

  • 20.有效的括号

四【题目描述】

  • 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串s,判断字符串是否有效。
  • 有效字符串需满足:
  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

五【题目示例】

  • 示例 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)

九【代码实现】

  1. 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();
    }

}
  1. 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)
{
	/*主函数省略*/
}

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值