给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]'的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
本题我最初的方法是:逐对去除相邻的闭合括号,通过递归的方式来判断是否有效。递归的判断条件是字符串长度是否改变且长度不为0,若最终长度为0,返回true;若进行一次递归后长度不为0且没有改变,返回false。为此需要在外部定义一个长度变量l。
根据字符串长度可以直接做出一些判断:长度为0,返回true;长度为奇数,返回false。
class Solution {
public:
int l=-1;
bool isValid(string s)
{
if(size(s)==l)
return false;
l=size(s);
if(l==0) return true;
if(l%2) return false;
string str="";
for(int i=0;i<l;i++)
{
char c=s[i];
if(s[i]=='('&&s[i+1]==')'||s[i]=='['&&s[i+1]==']'||s[i]=='{'&&s[i+1]=='}')
{
i++;
}
else
{
str+=c;
}
}
if(str=="")
return true;
else
return isValid(str);
}
};
时间复杂度:O(长度平方的一半)空间复杂度:O(1)
另一种方法:利用栈这一数据结构,遍历一遍字符串,如果是左括号,则压入栈,如果是右括号,则判断是否与栈顶元素匹配,若匹配,则将栈顶元素出栈,若不匹配,则返回false,遍历结束后,若栈为空,说明括号都可以匹配,返回true,否则返回false;
class Solution {
public:
bool isValid(string s)
{
stack<char> _s;
char c;
int l=size(s);
if(l==0) return true;
if(l%2) return false;
for(int i=0;i<l;i++)
{
c=s[i];
if(_s.empty())
_s.push(c);
else
{
switch(c){
case '(':_s.push(c);break;
case '[':_s.push(c);break;
case '{':_s.push(c);break;
case ')':
if(_s.top()!='(') return false;
else _s.pop();
break;
case ']':
if(_s.top()!='[') return false;
else _s.pop();
break;
case '}':
if(_s.top()!='{') return false;
else _s.pop();
break;
}
}
}
if(_s.empty())
return true;
else
return false;
}
};
时间复杂度:O(n)空间复杂度:O(n)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。