😄😊😆😃😄😊😆😃
开始cpp刷题之旅,多学多练,尽力而为。
先易后难,先刷简单的。
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
解法:栈
这个用栈比较容易理解,左括号推栈,右括号出栈,最后检查栈是否为空就行。
我刚开始想法是建个Map,然后检查左右括号数量是否相等,来确定最后的值,但是测试的时候有这种情况“([)]” 。 这种情况左右相等,但是是错的,才发现题目要求括号还要对应着。
class Solution {
public:
bool isValid(string s) {
unordered_map<char,int> myData = {
{'{',-1},
{'}',1},
{'[',-2},
{']',2},
{'(',-3},
{')',3}
};
stack<char> st;
bool istrue = true;
for(int i = 0;i<s.length();i++){
int temp= myData[s[i]];
if(temp<0){
st.push(temp);
}
else if(st.size()!=0 && st.top() + temp==0){
st.pop();
}
else{
istrue =false;
}
}
if(!st.empty()){
istrue = false;
}
return istrue;
}
};
还是通过建个无序Map,将左右赋值正负两种类型。通过判断栈顶值与当前值是否相加为0。
当循环结束时,栈不为0时,返回false。
当当前值大于0,但是与栈顶相加不为0 ,说明不对应,也返回false。
当当前值大于0,栈却为空,说明首先出现了右括号,返回false。
看一下提交记录。
OK,到此结束,工作再忙,但也要坚持每天一题。