一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
力扣20. 有效的括号
一、题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true 示例 2:
输入:s = "()[]{}" 输出:true 示例 3:
输入:s = "(]" 输出:false 示例 4:
输入:s = "([)]" 输出:false 示例 5:
输入:s = "{[]}" 输出:true
提示:
1 <= s.length <= 10^4 s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
我认为这道题目是简单的栈的使用,但是好久没用栈,都生疏了。因为我们每次遇到一个左括号,都入栈,然后遇到相同类型的右括号就出栈。因为后来的左括号需要相应的右括号先来,所以我们将后来的左括号放入栈顶。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是,第一次编写的代码如下,出现了问题,提交报错“Line 23: Char 17: runtime error: index -128 out of bounds for type 'char [*]' [solution.c]”。
char HashMap(char ch){ if(ch == '}') return '{'; if(ch == ')') return '('; if(ch == ']') return '['; return 0; } bool isValid(char * s){ int n = strlen(s); if(n % 2 == 1){ return false; } char temp[n+1],top = 0; for(int i=0;i<n;i++){ if(HashMap(s[i]) != 0){ if(top == 0 || temp[top-1] != HashMap(s[i])){ return false; } top--; } else{ temp[top++] = s[i]; } } if(top == 0){ return true; }else{ return false; } }但是我在本地Clion中输入那个测试用例又可以运行,真是头疼,于是我开始仔细阅读代码,终于发现了一个地方有问题。
char temp[n+1],top = 0;top应该是int类型,于是一改。。。
果然通过了。。。。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
本身是Python选手,看到了大佬写的Python解法,我自愧不如。
```
class Solution:
def isValid(self, s: str) -> bool:
dic = {'{': '}', '[': ']', '(': ')', '?': '?'}
stack = ['?']
for c in s:
if c in dic: stack.append(c)
elif dic[stack.pop()] != c: return False
return len(stack) == 1
作者:jyd
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/valid-parentheses-fu-zhu-zhan-fa-by-jin407891080/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
```
这代码如此*Pythonic*。
三、AC 代码:
char HashMap(char ch){
if(ch == '}') return '{';
if(ch == ')') return '(';
if(ch == ']') return '[';
return 0;
}
bool isValid(char * s){
int n = strlen(s);
if(n % 2 == 1){
return false;
}
char temp[n+1];
int top = 0;
for(int i=0;i<n;i++){
if(HashMap(s[i])){
if(top == 0 || temp[top-1] != HashMap(s[i])){
return false;
}
top--;
}
else{
temp[top] = s[i];
top++;
}
}
if(top == 0){
return true;
}else{
return false;
}
}
四、总结:
如果学栈的相关知识,这道题目应该是入门必做的!