原题链接:

https://leetcode-cn.com/problems/valid-parentheses/

题目:

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

有效字符串需满足:

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

示例:

示例 1:

输入: “()”
输出: true
示例 2:

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

输入: “(]”
输出: false
示例 4:

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

输入: “{[]}”
输出: true

题解思路:

  1. 观察题目具有最近相关性,所以用栈操作。
  2. 首先剪枝操作,长度为奇数的一定错。第一个字符不为“({【 ” 其中一个为错。
  3. 遍历字符串,当遇到左括号,入栈。遇到右括号,查看是否与栈顶元素匹配,匹配则出栈。
  4. 如果最后栈为空,那么它是有效的括号,反之不是。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Solution {
public:
bool isValid(string s) {

//1.
// stack<char> a;
// if (s.size()%2==1) return false;
// for(int i = 0;i<s.size();i++) {
// if(s[i] == '(' || s[i] == '[' || s[i] == '{') {
// a.push(s[i]);
// continue;
// }
// if(a.empty()) return false;
// if((s[i]==')' && a.top() == '(') || (s[i]==']' && a.top() == '[') || (s[i]=='}' && a.top() == '{')) {
// a.pop();
// }else {
// break;
// }
// }
// return a.empty();

//2.hash_map
// if(s.size() %2 != 0) return false;
// stack<char> a;
// unordered_map<char,char> pair = {
// {')','('},
// {'}','{'},
// {']','['}
// };
// for (char str : s) {
// if (pair.count(str) ) {
// if(a.empty() || a.top() != pair[str]) return false;
// a.pop();
// } else {
// a.push(str);
// }
// }
// return a.empty();


//3.switch case
// if(s.size() % 2 != 0) return false;
// stack<char> a;
// for ( char str : s ){
// switch(str){
// case '(' :
// case '{' :
// case '[' : a.push(str); break;
// case '}' : if(a.empty() || a.top() != '{') return false; a.pop(); break;
// case ']' : if(a.empty() || a.top() != '[') return false; a.pop(); break;
// case ')' : if(a.empty() || a.top() != '(') return false; a.pop(); break;
// default : ;
// }
// }
// return a.empty();

}
};