【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
#include
#include
#include

/*使用数组模拟栈*/
#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语言版
    【LeetCode每日一题】——20.有效的括号_第1张图片

  2. C语言版
    【LeetCode每日一题】——20.有效的括号_第2张图片

你可能感兴趣的:(LeetCode,栈,leetcode,数据结构,算法,字符串)