003 有效的括号 (C#力扣)

一、题目


二、解答

思路

①先将输入的字符串转ASCII码存入数组arr[]中,字符串长度如果是奇数直接排除,偶数才进入判断。

②遍历arr[]中的每个括号,如果是左括号,推进栈里,如果是右括号且栈为空(说明没有与之匹配的了,返回false)。

③接下来如果遇到是右括号,取出栈顶元素进行匹配,并删除该栈顶元素。一趟趟遍历完数组arr[]中的ASCII码后,如果此时栈为空,就是true,匹配成功!

public class Solution {
    public bool IsValid(string s) {
        //所有字符串转ASCII码
        byte[] arr = System.Text.Encoding.ASCII.GetBytes(s);
        //如果输入是奇数,直接排除,偶数才继续考虑
        if(arr.Length%2==0){
            Stack<byte> left=new Stack<byte>();
            //遍历arr中的每个括号
            foreach(byte item in arr){
                //如果是左括号,推进栈里
                if(item==40 | item==91 | item==123){
                    left.Push(item); 
                }
                else{//一旦遇到右括号,弹出栈的顶部对象并删除
                    if(left.Count!=0){//如果左栈不为空
                        byte top=left.Pop();
                        //判断遇到的右括号是哪种
                        if(item==41){
                            if(top!=40){return false;}
                        }
                        if(item==93){
                            if(top!=91){return false;}
                        }
                        if(item==125){
                            if(top!=123){return false;}
                        }
                    }
                    else if(left.Count==0){//遇到右括号,但此时左栈为空
                        return false;
                    }
                }
            }
            //此时如果栈空,说明对的
            if(left.Count==0){
                return true;
            }else{
                return false;
            }
        }
        else{//奇数直接排除
            return false;
        }

    }
}

执行用时:56 ms, 在所有 C# 提交中击败了99.63%的用户

内存消耗:37 MB, 在所有 C# 提交中击败了63.24%的用户

(嚯嚯!)

知识点:

- 栈及其方法:

C#中栈的用法_Will_Pixar的博客-CSDN博客_c# 栈

C#栈的简单介绍_bruce135lee的博客-CSDN博客_c# 栈

- 字符串转ASCII码:

c#怎么string转化成ascii码 - 百度文库 (baidu.com)

- ASCII码对照表:

C# 标准ASCII 码表_qq_42675313的博客-CSDN博客_c#ascii

三、其他方法

评论区看到的,用C#实现了一下

虽然运行出来时间/空间效率不高,但是思路真的

思路:一轮轮迭代,每次从都取出成对的括号,如果是正确的括号匹配,那么最终字符串里就为空,即长度为0,返回true。如果是错误的括号匹配,那么最终肯定会剩下不匹配的括号,此时判断字符串长度不为0,返回false。

public class Solution {
    public bool IsValid(string s) {
         while(true){
            int l=s.Length;
            s=s.Replace("()","");
            s=s.Replace("{}","");
            s=s.Replace("[]","");
            if(s.Length==l){return l==0;}
        }
    }
}

知识点:

- 字符串长度:s.Length——属性

- 字符串替换:s.Replace()——方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值