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

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

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

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

以上是关于Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—20. 有效的括号(栈)—day02

Leetcode刷题100天—20. 有效的括号(栈)—day02

leetcode刷题5.有效的括号——Java版

Leetcode刷题100天—856. 括号的分数(栈)—day03

Leetcode刷题100天—856. 括号的分数(栈)—day03

Leetcode 678.有效的括号字符串