给定一个只包括 ′ ( ′ , ′ ) ′ '(',')' ′(′,′)′, ′ ' ′{ ′ ' ′, ′ ' ′} ′ ' ′, ′ [ ′ , ′ ] ′ '[',']' ′[′,′]′ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1 1 1:
输入: "()"
输出: true
示例 2 2 2:
输入: "()[]{}"
输出: true
示例 3 3 3:
输入: "(]"
输出: false
示例 4 4 4:
输入: "([)]"
输出: false
示例 5 5 5:
输入: "{[]}"
输出: true
思路:
1)栈解决括号匹配问题。当遇到左部符号时,将其压入栈;遇到右部符号时,进行判断, ( 1 ) (1) (1)如果此时栈为空,则说明不能匹配,返回 f a l s e false false, ( 2 ) (2) (2)栈不为空,取栈顶元素,判断是否为左部符号,如果能够匹配则将左部符号出栈,若不能匹配返回 f a l s e false false
class Solution {
public:
bool isValid(string s) {
if (s.size() == 0)
return true;
if (s.size() == 1)
return false;
stack<char> st;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[')
st.push(s[i]);
else if (s[i] == ')'){
if (st.empty())
return false;
char c = st.top();
if (c == '(') {
st.pop();
}else {
return false;
}
}
else if (s[i] == '}'){
if (st.empty())
return false;
char c = st.top();
if (c == '{') {
st.pop();
}else {
return false;
}
}
else if (s[i] == ']'){
if (st.empty())
return false;
char c = st.top();
if (c == '[') {
st.pop();
} else {
return false;
}
}
}
return st.empty() ? true : false;
}
};
2)用 m a p map map保存括号的匹配关系,例: k e y key key为 ′ ( ′ '(' ′(′, v a l u e value value为 ′ ) ′ ')' ′)′。然后跟上面的思想类似,代码稍显简单。
class Solution {
public:
bool isValid(string s) {
map<char, char> mp{{'(',')'},{'{','}'},{'[',']'}};
vector<char> vec;
if (s == "")
return true;
if (s[0] == ')' || s[0] == '}' || s[0] == ']')
return false;
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == '(' || s[i] == '{' || s[i] == '[')
vec.push_back(mp[s[i]]);
else if (s.empty() || vec.back() != s[i])
return false;
else
vec.pop_back();
}
return (vec.empty()) ? true : false;
}
};