Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36

这篇博客介绍了如何利用栈解决LeetCode中的678题,即判断一个包含括号和星号的字符串是否有效。博主提供了详细的Java代码实现,通过创建两个栈分别存储左括号和星号,然后遍历字符串进行匹配。在遍历过程中,遇到右括号时尝试从左括号栈或星号栈匹配,最后检查栈是否为空以及剩余的星号能否匹配剩下的左括号。文章适合对算法和数据结构感兴趣的读者阅读。
摘要由CSDN通过智能技术生成

前言:

作者:神的孩子在歌唱

大家好,我叫运智

image-20210912124448740

678. 有效的括号字符串

难度中等325收藏分享切换为英文接收动态反馈

给定一个只包含三种字符的字符串:*,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

  1. 任何左括号 ( 必须有相应的右括号 )
  2. 任何右括号 ) 必须有相应的左括号 (
  3. 左括号 ( 必须在对应的右括号之前 )
  4. * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
  5. 一个空字符串也被视为有效字符串。

示例 1:

输入: "()"
输出: True

示例 2:

输入: "(*)"
输出: True

示例 3:

输入: "(*))"
输出: True

注意:

  1. 字符串大小将在 [1,100] 范围内。
package 字符串;

import java.util.Stack;
/*
 * https://leetcode-cn.com/problems/valid-parenthesis-string/
 */
public class _678_有效的括号字符串 {
//	通过栈来判断,左括号星号入栈,入栈的元素是他们的下标,遇到右括号就出栈,
//	最后判断栈是否为空,如果不为空左括号下标是否大
    public boolean checkValidString(String s) {
//    	设置两个栈
    	Stack<Integer> left_stack=new Stack<>();
    	Stack<Integer> planet_stack=new Stack<>();
//    	循环下标如果是(和*就入栈,是)就取出(匹配,如果(栈为空,就取出*做匹配,两个都为空就返回false
    	for(int i=0;i<s.length();i++) {
    		char character=s.charAt(i);
//    		如果是左括号就存入下标
    		if (character=='(') {
				left_stack.push(i);
			}else if(character=='*') {
				planet_stack.push(i);
			}else {
//				否则如果(栈不为空就匹配)
				if (!left_stack.isEmpty()) {
					left_stack.pop();
				}else if (!planet_stack.isEmpty()) {
					planet_stack.pop();
				}else {
					return false;
				}
			}

    	}
//		上面的是匹配了),可是如果栈left和planet不为空,还得要通过planet匹配
		while(!left_stack.isEmpty()&&!planet_stack.isEmpty()) {
			int left=left_stack.pop();
			int planet=planet_stack.pop();
//			如果left的下标大于planet下标,说明在 plant后面,无法匹配
			if (left>planet) {
				return false;
			}
		}
//		如果遍历完毕没有异常,且left为空,就返回true否则false
    	
    	return left_stack.isEmpty();
    }
}

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神的孩子都在歌唱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值