LeeCode有效的括号——C

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

题目描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:
输入: “()”
输出: true

示例 2:
输入: “()[]{}”
输出: true

示例 3:
输入: “(]”
输出: false

示例 4:
输入: “([)]”
输出: false

示例 5:
输入: “{[]}”
输出: true

题解

  1. 我们从表达式的左侧开始,每次只处理一个括号。
  2. 假设我们遇到一个开括号(即
    (),表达式是否无效取决于在该表达式的其余部分的某处是否有相匹配的闭括号(即
    ))。此时,我们只是增加计数器的值保持跟踪现在为止开括号的数目。left += 1
  3. 如果我们遇到一个闭括号,这可能意味着这样两种情况:
    1. 此闭括号没有与与之对应的开括号,在这种情况下,我们的表达式无效。当 left == 0,也就是没有未配对的左括号可用时就是这种情况。
    2. 我们有一些未配对的开括号可以与该闭括号配对。当 left > 0,也就是有未配对的左括号可用时就是这种情况。
  4. 如果我们在 left == 0 时遇到一个闭括号(例如 )),那么当前的表达式无效。否则,我们会减少 left 的值,也就是减少了可用的未配对的左括号的数量。
  5. 继续处理字符串,直到处理完所有括号。
  6. 如果最后我们仍然有未配对的左括号,这意味着表达式无效。

代码

bool isValid(char* s) {
	int length = strlen(s);										//求长度 
	if (length == 0) {
		return true;
	}
	char* stack = (char*)malloc(sizeof(char) * (length/2+1));	//分配最大空间 
	int top = -1;

	for (int i = 0; i < length; i++) {
		if (s[i] == '(' || s[i] == '[' || s[i] == '{') {		// ([{ 就加入栈当中 
			top++;
			stack[top] = s[i];
		}
		else if (s[i] == ')' || s[i] == '}' || s[i] == ']') {	// )]} 就把 ([{ 移除 
			if (top == -1) {									// 还有)]} 但没有 ([{ 
				return false;
			}
			else if (s[i] == ')' && stack[top] == '(') {		//移除 
				top--;
			}
			else if (s[i] == ']' && stack[top] == '[') {
				top--;
			}
			else if (s[i] == '}' && stack[top] == '{') {
				top--;
			}
			else {												//其它字符返回 false 
				return false;
			}
		}
		else {													//其它字符返回 false
			return false;
		}
	}
	return (top == -1 ? true : false);							//top==-1,在栈顶等于栈底为真 
}

调试

#include<stdio.h>
#include<string.h>
#include<malloc.h>

int main() {
	char* s = (char*)"()[]";
	if (isValid(s) == true) {
		printf("true");
	}
	else {
		printf("false");
	}
	return 0;
}

结果

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值