关于Leetcode的刷题方法,在网上看了很多,每个人都有着不同的见解。作为Leetcode小白,我还是决定用最原始的方法进行刷题,即把每一题的思路都记录下来,虽然比较耗时间,但是个人感觉这样子的方法会让我对题目有更深入的了解。希望能在该专栏中记录下刷题过程中遇到的大大小小的问题🍊。
题目描述
解题思路
- 这题考察的是栈的应用。记得在数据结构课上的时候老师讲过一个用栈匹配符号的问题跟这个很像,所以第一时间想到了用栈这个结构去写。
- 若字符串长度为奇数,则一定错误,因为符号都是两两匹配的
- 遍历字符串:
- 若当前字符为 ’ ( ’ 或者 ’ [ ’ 或者 ’ { ’ 的左符号的其中一个,则将其装进栈中,等待被右符号匹配
- 若当前字符为右符号,则将其与栈顶元素进行比较:
- 若相等,则匹配成功,并弹出栈顶元素,表示已匹配
- 若不相等,则返回0
- 遍历完整个字符串后:
- 若栈不为空,说明仍然有字符未被匹配,返回0
- 若栈为空,则返回1
理解难点
- 由于右符号与之匹配的必须是最近一个的左符号,比如” { ( ) }“中,第一个右符号是”)“,那么与之匹配的就是它前面最靠近它的符号”(“,而不是较远的”{“,而栈的特性就是后进先出,因此栈顶永远保存的都是最近一次出现的左符号。
题目代码
class Solution {
public:
bool isValid(string s) {
int len = s.length(); //字符串长度
if(len%2 == 1) //奇数一定不符合
return 0;
stack<char> A;
for(int i = 0;i<len;i++){
if(s[i] == '(' || s[i] == '{' || s[i] == '[')
A.push(s[i]); //左符号则进栈
else if(!A.empty()){ //保证栈不空
char temp = A.top(); //匹配右符号
if(temp == '(' && s[i] != ')' ||
temp == '[' && s[i] != ']' ||
temp == '{' && s[i] != '}')
return 0;
A.pop(); //出栈
}
else{ //栈为空则退出
return 0;
}
}
if(!A.empty()) //栈不为空则表示有字符未被匹配
return 0;
return 1;
}
};