题目描述

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

有效字符串需满足:

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

示例 1:

输入: “()”
输出: true

示例 2:

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

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

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

解答 By 海轰

提交代码

class Solution {
public:
bool isValid(string s) {
int len=s.length();
// cout<<len<<endl;
if(len==0) return true;
if(len%2!=0) return false;
if(s[0]==')'||s[0]=='}'||s[0]==']')
return false;
stack<char> t;
t.push(s[0]);
for(int i=1;i<len;++i)
{
if(s[i]=='('||s[i]=='{'||s[i]=='[')
t.push(s[i]);
else
{
if(s[i]==')'&&t.top()=='(')
t.pop();
else if(s[i]=='}'&&t.top()=='{')
t.pop();
else if(s[i]==']'&&t.top()=='[')
t.pop();
else
return false;
}
}
return t.empty();
}
};

运行结果

LeetCode刷题(5)~有效的括号_c++


思路

        栈法【确实很巧妙】

C++完整测试代码

#include <iostream>
#include <stack>
using namespace std;
bool isValid(string s)
{
int len = s.length();
// cout<<len<<endl;
if (len == 0)
return true;
if (len % 2 != 0)
return false;
if (s[0] == ')' || s[0] == '}' || s[0] == ']')
return false;
stack<char> t;
t.push(s[0]);
for (int i = 1; i < len; ++i)
{
if (s[i] == '(' || s[i] == '{' || s[i] == '[')
t.push(s[i]);
else
{
if (s[i] == ')' && t.top() == '(')
t.pop();
else if (s[i] == '}' && t.top() == '{')
t.pop();
else if (s[i] == ']' && t.top() == '[')
t.pop();
else
return false;
}
}

return t.empty();
}
int main()
{
string a = "([])";
cout << isValid(a) << endl;

return 0;
}

其他解答

题目来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses