解题思路:
- 想法1:用三个int类型来记录三种括号的出现次数,左括号出现+1,右括号出现-1,若某一个数字小于0,则返回false
- 想法2:之前看数据结构的时候记得这个似乎可以用栈来解决。但我想了想,觉得这题似乎用不了栈
代码:
class Solution {
public:
bool isValid(string s) {
int m = 0, n = 0, p = 0;
int length = s.size();
for (int i = 0; i < length; ++i) {
switch (s[i]) {
case '(': ++m; break;
case ')': --m; break;
case '{': ++n; break;
case '}': --n; break;
case '[': ++p; break;
case ']': --p; break;
};
if (m<0 || n<0 || p<0) return false;
}
return (m==0 && n==0 && p==0) ? true: false;
}
};
第一遍写的时候,switch-case里没加break,导致出错,改正后发现依旧是错的,苦思不得其解,后来才发现,原来时题目没读清楚,"([)]"时=是false。。。所以其实这题是标准的栈。
解题思路:
运用哈希表和栈来解决。
代码:
C++:
class Solution {
public:
bool isValid(string s) {
//用哈希表对每个字符进行命名,方便后面的判断。
unordered_map<char,int> m{{'(',1},{'[',2},{'{',3},
{')',4},{']',5},{'}',6}};
stack<char> st;
bool istrue=true;
//遍历字符串s中的每个字符
for(char c:s){
//通过哈希表得到序号(int)
int flag=m[c];
//若1~3,则入栈
if(flag>=1&&flag<=3) st.push(c);
//否则若栈不空则进行匹配,匹配成功出栈,
else if(!st.empty()&&m[st.top()]==flag-3) st.pop();
//不成功或本来就是空栈则返回false,退出循环。
else {istrue=false;break;}
}
//若遍历完所有的字符后发现栈不为空栈,则返回false
if(!st.empty()) istrue=false;
return istrue;
}
};
python:
class Solution:
def isValid(self, s: str) -> bool:
dic = {')':'(',']':'[','}':'{'}
stack = []
for i in s:
if stack and i in dic:
if stack[-1] == dic[i]: stack.pop()
else: return False
else: stack.append(i)
return not stack
都挺巧妙的。