20 有效的括号
大致意思就是判断括号是否成对,这在数据结构中是学习栈的时候给的例题,所以这里应该是应用栈这个数据结构进行解题。
写出来是这样的,纯属暴力、小白写法.
class Solution {
public:
bool isValid(string s) {
if(s.empty()) return true;
stack<char> myStack;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
myStack.push(s[i]);
continue;
}
if(myStack.empty())
return false;
if(!myStack.empty()){
if(s[i]==')'){
char k=myStack.top();
if(k!='(')
return false;
}
if(s[i]=='}'){
char k=myStack.top();
if(k!='{')
return false;
}
if(s[i]==']'){
char k=myStack.top();
if(k!='[')
return false;
}
myStack.pop();
}
}
if(!myStack.empty())
return false;
return true;
}
};
但用这样的思路,大神们都是用哈希实现的:
class Solution {
public:
bool isValid(string s) {
if(s.length()%2!=0) return false;//一但是奇数说明不是有效的括号
map<char,char> wordbook;//建立哈希表
wordbook.insert(map<char,char>::value_type(')','('));
wordbook.insert(map<char,char>::value_type(']','['));
wordbook.insert(map<char,char>::value_type('}','{'));
stack<char> mystack;//建立栈
for(int i=0;i<s.length();i++)
{
if(s[i]=='['||s[i]=='{'||s[i]=='(')//匹配到左括号
mystack.push(s[i]);//放入栈中
else if(s[i]==']'||s[i]=='}'||s[i]==')')//匹配到右括号
{
if(mystack.empty()) return false;
//匹配到右括号,栈中应该存在左括号。否则就是无效的括号
if(wordbook[s[i]]==mystack.top())//与栈顶元素进行匹配
{
mystack.pop();//匹配成功删除栈顶元素
continue;
}
else return false;
}
}
if(mystack.empty()) return true;//有效的括号到最后检测结束栈中应没有元素
else return false;
}
};
结果如下,效率大致和我的小白解法差不多,但明显代码简洁且易于增长,要学习哈希这种方法。