题目描述:
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
分析:
题意:给定一个只包含'('
, ')'
, '{'
, '}'
, '['
, ']'
字符串,判断是否合法。
思路:因为圆括号、中括号、花括号存在嵌套的结构,所以我们需要使用stack来处理。构造一个stack,从左到右扫描字符串,总体分为三步走:①遇到字符'('
, '{'
, '['
时,直接压入stack中。②遇到 ')'
, '}'
, ']'
时,与stack栈顶元素进行匹配:如果配对成功,则弹出栈顶元素;否则说明这是一个非法字符串,直接返回false。③最后判断stack是否为空,如果为空,则返回true,否则返回false(可能对应这种情况:'('
, '('
, '('
)。
假设字符串长度为n,则时间复杂度为O(n)。
代码:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isValid(string s) {
int n = s.length();
// Exceptional Case:
if(n == 0){
return true;
}
if(n & 1){
return false;
}
stack<char> st;
for(int i = 0; i <= n - 1; i++){
if((s[i] == '(') || (s[i] == '[') || (s[i] == '{')){
st.push(s[i]);
}
else if((s[i] == ')') || (s[i] == ']') || (s[i] == '}')){
if(st.empty()){
return false;
}
else{
if(((st.top() == '(') && (s[i] == ')')) || ((st.top() == '[') && (s[i] == ']')) || ((st.top() == '{') && (s[i] == '}'))){
st.pop();
}
else{
return false;
}
}
}
}
return st.empty();
}
};