题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
我的答案:
class Solution {
public:
bool isValid(string s) {
if(s.size()%2!=0) //如果是奇数个,那么一定排除
return false;
if(s.size()==0) //如果等于0,那么返回true ,我自己一开始想到了,但是没有实行
return true;
string temp;//下面的程序是默认输入的是一个长度大于等于2的string,前面必须通过判断保证这一点
temp.push_back(s[0]);
for(int i=1;i<s.size();++i)
{
int k=temp.size()-1;
if(temp[k]=='('&&s[i]==')')
temp.pop_back();
else if(temp[k]=='['&&s[i]==']')
temp.pop_back();
else if(temp[k]=='{'&&s[i]=='}')
temp.pop_back();
else
temp.push_back(s[i]);
}
return temp.size()==0;
}
};
/*本题用到了堆栈的思想,从第一个元素开始压入,匹配就pop,否则就push*/
一中更优的答案,这种方法不需要历遍所有的元素,当第一次不匹配的时候就直接返回false
class Solution {
public:
bool isValid(string s) {
stack<char> paren;
for (char& c : s) {
switch (c) {
case '(':
case '{':
case '[': paren.push(c); break;
case ')': if (paren.empty() || paren.top()!='(') return false; else paren.pop(); break;
case '}': if (paren.empty() || paren.top()!='{') return false; else paren.pop(); break;
case ']': if (paren.empty() || paren.top()!='[') return false; else paren.pop(); break;
default: ; // pass
}
}
return paren.empty() ;
}
};
参考: https://blog.csdn.net/m0_37693059/article/details/76691491