【020】有效的括号(Valid Parentheses)

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

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

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

示例 1:

输入: “()”
输出: true

示例 2:

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

不复杂,只要找反括号就行了

来自评论区的巧方法

如果答案的是true的话,每次都能去掉一个完整的括号,最后就去完了
在这里插入图片描述

自己的C#

//方法一:第一次做的代码

public static bool IsValid(string s)
{
    //单数直接返回false
    if (s.Length % 2 != 0) 
        return false;

    char[] chars = s.ToCharArray();
    List<char> openChar = new List<char> { '(', '{', '[' }; //开括号
    List<char> closeChar = new List<char> { ')', '}', ']' };//闭括号
    //从头开始遍历
    //找到一个闭括号,下标为closeNum
    for (int closeNum = 0; closeNum < s.Length; closeNum++) 
    {
        //找到闭括号
        if (closeChar.Contains(chars[closeNum]))
        {
            //从当前位置,向前找
            //找到第一个开括号
            for (int openNum = closeNum - 1; openNum >= 0; openNum--)
            {
                //找到第一个正括号
                if (openChar.Contains(chars[openNum]))
                {
                    //判断和当前闭括号是否闭合
                    if (IsClose(chars[openNum], chars[closeNum]))
                    {
                        //闭合,将两者改为'N',表示null
                        chars[openNum] = chars[closeNum] = 'N';
                        //跳出循环找下一个闭括号
                        break;
                    }
                    //不闭合
                    else
                    {
                        return false;
                    }
                }
            }
        }
        //到最后都没有找到闭括号
        else if (closeNum == s.Length - 1) 
        {
            return false;
        }
    }

    return true;
}


/// <summary>
/// 是否闭合
/// </summary>
/// <param name="open"></param>
/// <param name="close"></param>
/// <returns></returns>
private static bool IsClose(char open, char close)
{
    return (open == '(' && close == ')') || (open == '{' && close == '}') || (open == '[' && close == ']');
}

//方法二:第二次优化了一下,找各自索引
public static bool IsValid2(string s)
{
    //单数直接返回false
    if (s.Length % 2 != 0)
        return false;

    char[] chars = s.ToCharArray();
    List<char> closeChar = new List<char> { ')', '}', ']' };//闭括号

    List<int> openArr = new List<int>();
    List<int> closeArr = new List<int>();
    //从头开始遍历
    //找到一个闭括号,下标为closeNum
    for (int i = 0; i < s.Length; i++)
    {
        //找到闭括号
        if (closeChar.Contains(chars[i]))
        {
            closeArr.Add(i);
        }
        else
        {
            openArr.Add(i);
        }
    }

    if (closeArr.Count != openArr.Count) 
        return false;

    //对于第一个闭括号在chars中的索引
    for (int closeNum = 0; closeNum < closeArr.Count; closeNum++)
    {
        int closeIndex = closeArr[closeNum];
        //找到该位置前的第一个开括号索引
        for (int openNum = openArr.Count - 1; openNum >= 0; openNum--) 
        {
            //找到最近的开括号索引
            if (openArr[openNum] < closeIndex)
            {
                //开括号索引
                int openIndex = openArr[openNum];
                //是否闭合
                if (IsClose(chars[openIndex], chars[closeIndex]))
                {
                    //在开括号中移除该项
                    openArr.RemoveAt(openNum);
                    break;
                }
                else
                {
                    return false;
                }
            }
            //在openArr中找到最后还没有找到开括号,说明不存在
            else if (openNum == 0) 
            {
                return false;
            }
        }
    }

    return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值