前言
- 文章作为日记或心得,记录学习过程
- 本文记录本题(源自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;