力扣20. 有效的括号---模拟栈+哈希映射比对

20. 有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true
示例 2:

输入: "()[]{}"
输出: true
示例 3:

输入: "(]"
输出: false
示例 4:

输入: "([)]"
输出: false
示例 5:

输入: "{[]}"
输出: true

题解:

由题可知,我们需要先判断如何解题。

通过几个例子我们可以发现,出现的第一个右边括号定然与其最近的左边括号匹配。且先出现的左边括号定然后进行匹配。所以这是一种先进后出的问题。

对于这种先进后出的问题我们经常使用栈来解决。

即设立一个数组模拟栈,接着遍历s数组,如果是左括号则存进栈内如果是右括号则进行下列判断:

1.栈为空时,此时因为栈外出现了右边括号,而栈内空空如也,不可能有东西来匹配右边括号。直接返回假。

2.栈不为空.此时由于 “先进先出” 思想,则将栈顶的元素拿来与栈外元素进行比对,如果符合题意,则继续进行下一轮的比对,且让比对成功的,原先存储左括号的栈顶元素出栈;如果不符合题意,直接返回假。

通过上述模拟即可制作一个栈来解决问题

需要注意的是
自己独享一个表示下标的变量,并且栈是从底部依次向上累加的,且注意所谓的“出栈”其实就是覆盖原位置的元素。
且对于左边括号与右边括号的对应关系我们可以使用一个函数来模拟哈希映射的过程来完成比对任务,减少了许多if语句的使用。
最后注意的一点是最后栈内要为空才能返回真,如果栈内还有东西的话是不行的。栈是否为空可以由栈顶下标来表示,若此时栈顶下标为0则栈为空

代码:

char map(char x)//模拟哈希映射函数完成左右比对过程
{
    
    
    switch(x)
    {
    
    
        case ']':return '[';
        case '}':return '{';
        case ')':return '(';
        default: return 0;
    }
}
bool isValid(char * s){
    
    
    if(strlen(s)%2)
        return 0;
    char temp[strlen(s)+1];//用来模拟栈的数组
    int top = 0;//栈顶元素下标
    for(int i=0;i<strlen(s);i++)//遍历s数组
    {
    
    
        char cmp = map(s[i]);//作为一个比较量来判断是否要进行比对操作
        //即由他加上模拟哈希映射函数返回值来判断此时是右边括号还是左边括号
        if(cmp)
        {
    
       //即此时要进行比对操作,即此时s[i]为右括号了
            if(top==0||cmp!=temp[top-1])//原先多加了个1所以此时减一
            {
    
    
                return 0;
            }
            top--;//出栈,即覆盖
        }
        else//即此时cmp是左括号的情况下,所以进入映射函数返回0,不用进行比对操作,直接入栈即可
        {
    
    
            temp[top]=s[i];
            top++;//向栈顶靠拢
        }
    }
    return top==0;//即栈内为空才为真正解决问题,并且空字符串题目已说明是有效的
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/112725581