数据结构与算法作业13

Leetcod20

题目

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

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

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

分析

已知:给定了一个字符串给我们。目标:判断里面是否为是有效字符串。

解法一

由题意可知:可以通过将字符串的每个元素都遍历一遍,然后将左半部分的括号时将其提出并输入进栈,在碰到右半部分的括号时候 判断此时栈的顶部的是否为其对应的那部分括号若是则删除栈的顶部的元素。反之则将其存入栈。如此通过判断该栈最后还有没有括号在里面由此来确定改字符串是否有效。
代码:

public class Solution 
{    
	public bool IsValid(string s)     
	{        
		Stack<char> op = new Stack<char>();        
		op.Push('.');        
		if(s.Length==1)        
		{            
			return false;        
		}        
		foreach(var a in s)        
		{            
		switch(a)            
		{                
			case '(':op.Push(a);break;                
			case '{':op.Push(a);break;                
			case '[': op.Push(a);break;                
			case ')':                     
				if(op.Peek()=='(')                    
				{                        
					op.Pop();                    
				}                    
				else                    
				{                        
					op.Push(a);                  
				}                    
				break;                
				case'}':       				  
				       if(op.Peek()=='{')                    
					{                       
						op.Pop();                    
					}                    
					else                    
					{                        
					      op.Push(a);                    
					}                    
					break;                
				case']':                     
				if(op.Peek()=='[')                    
				{                        
					op.Pop();                    
				}                    
				else                    
				{                        
					op.Push(a);                    
				}                    
				break;            
			}        
		}       
		if(op.Count==1)        
		{            
			return true;        
		}        
		else        
		{            
			return false;        
		}    
	}
}

然而效果真的差
在这里插入图片描述

解法二

然后我思考了好久把代码修整简化了一遍

public class Solution 
{    
public bool IsValid(string s) 
{        
	if (s.Length == 0) return true;        
	if (s.Length % 2 != 0) return false;        
	if (s[0] == ')' || s[0] == ']' || s[0] == '}') 
	return false;                
	Stack<int> sta = new Stack<int>();
        foreach (var item in s)        
        {            
        if (item == '(' || item == '[' || item == '{')                                                               
        sta.Push(item);            
       else if (sta.Count == 0 ||sta.Peek()+(sta.Peek()== '(' ? 1 : 2) != item)                
       return false;            
       else                
       sta.Pop();        
       }
        return sta.Count == 0;
}

结果效果更差了在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值