LeetCode刷题:20.有效的括号+栈+哈希表

前言

  • 文章作为日记或心得,记录学习过程
  • 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
  • 如对内容有任何建议或看法,欢迎评论区学习交流

正文

题目

在这里插入图片描述
思路:找到任意一对括号后,把它清除

  • 从左向右更新,找到任意右括号之前的最后一个左括号
  • 如果右边的+1位置和它配对,则把这两个清除。
  • 若不配对,直接返回。
  • 直至全部清空。

解答

符号 ASCII
( 40
) 41
[ 91
] 93
{ 123
} 125
class Solution {
public:
    bool isValid(string s) {
        int rflag = 0;
        int lflag = 0;
        //如果size为0和1,直接返回,如果大于2且找不到右括号就直接到最后的返回false
        while (s.size() >= 2 && (s.find(')') || s.find(']') || s.find('}')))
        {
            //flag记录第一个右括号的位置
            for (size_t i = 0; i < s.size(); i++)
            {
                //更新旗子位置,找到后退出循环
                rflag = i;
                if (s[i] == ')' || s[i] == ']' || s[i] == '}')
                    break;
            }
            //判断是否为'((('类似的
            if (rflag == s.size())
                return false;
            lflag = rflag - 1;
            //判断是否为')))'类似的
            if (lflag < 0)
                return false;
            //判断该对括号是否闭合,闭合就删除,不闭合就是false
            if (s[rflag] - s[lflag] == 1 || s[rflag] - s[lflag] == 2)
            {
                s.erase(lflag, 2);
            }
            else
                return false;
        }
        //无论有没有执行删除操作,只要是空就是true
        if (s == "")
            return true;
        return false;
    }
};

结果

在这里插入图片描述
并不是一次成功,’((’’))’’)('情况都因为没考虑而报错

学习新知识

s.erase(lflag, 2);第一个参数为起始位置,第二个参数为长度,删除后自动补齐
如"abc".erase(1,1)->“ac”

其他人的解答

看了别人的解答,发现我写的甚是臃肿,md我真菜,痛哭

zrita给出了多种解答,从中可以学到很多新内容
其第一种方法只用到了,不复制粘贴了,自己试着理解着默写一下
思路大概就是

  • 遍历字符串
  • 遇到所有的左括号时,把它的右括号放到栈里
  • 如果遇到了右括号
  • 判断此时栈是否为空,栈顶的括号是否是自己
  • 如果空,说明右括号多一个;如果不是自己,说明不匹配,均返回false
  • 否则就pop
  • 进入下次循环
class Solution {
public:
    bool isValid(string s) {
        //奇数肯定不合格
        if (s.size() % 2 == 1)
            return false;
        //建立一个栈
        stack<char> mystack;
        //遍历s
        for (char c:s)
        {
            if (c == '(')
                mystack.push(')');
            else if (c == '[')
                mystack.push(']');
            else if (c == '{')
                mystack.push('}');
            else
            {
                //(空的情况说明:空字符串||一开始就是右括号||右括号多出来了)||不等于是不配套
                if (mystack.empty() || c != mystack.top())
                    return false;
                mystack.pop();
            }
        }
        //遍历完后,栈是空的就是true,有内容就是false
        return mystack.empty();
    }
};

在这里插入图片描述
他的第二种方法用了map,思路和之前一样,只不过上一种更简单点。map只是作为储存
仍是自己默写

class Solution {
public:
    bool isValid(string s) {
        //定义个map存储对应符号
        unordered_map<char, char> map = { {')','('},{']','['},{'}','{'} };
        stack<char> mystack;
        for (char c : s)
        {
            if (c == '(' || c == '[' || c == '{')
                mystack.push(c);
            else
            {
                if (mystack.empty() || mystack.top() != map[c])
                    return false;
                mystack.pop();
            }
        }
        return mystack.empty();
    }
};

在这里插入图片描述
他的第三种方法思路和我类似由相差的不少
我是先找右括号,他是直接左括号配对删除。想法很奇妙,暂时先放他的代码。

class Solution {
public:
    bool isValid(string s) {
        unordered_map<char, char> mp = { { '{','}' }, { '(',')' }, { '[',']' } };
        int i = 0;
        while(i < s.size())
        {
            if(mp[s[i]] == s[i+1] && s[i+1] !='\0')
            {
                s.erase(i,2);
                i = -1;
            }
            i++;
        }
        return !s.size();
    }
};

作者:zrita
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/cshuang-100-z-by-zrita/
来源:力扣(LeetCode)

学习新知识

stack<char> mystack#include<stack>
for (char c:s)为遍历字符串此方法比for (char& c:s)更快
哈希表的赋值方法:(只能通过关键值key返回value)
1.unordered_map<int, int> map = { {key,value},{key',value'} }
2.myhash[nums[key]] = value;

猜你喜欢

转载自blog.csdn.net/wwz1751879/article/details/107856571