题目描述
给定一个只包括( } { } [ ]的字符串s,判断字符串是否有效。有效的字符串需满足:
1. 左括号必须用相同类型的右括号闭合;
2.左括号必须以正确的顺序闭合。
示例:
1: 输入:s = "()" 输出: true
2: 输入:s="()[]{}" 输出:true
3: 输入:s="(]" 输出:true
4: 输入:s="([)]" 输出:false
5: 输入:s="{[]}" 输出:true
解题方法:栈 + map。将左括号压入栈,遇到右括号则判断并弹出栈顶元素,最后如果匹配,栈必然为空。
代码
#include <iostream>
#include <map>
#include <string>
#include <stack>
bool is_valid_parenthesis(const std::string& str) {
std::stack<char> s;
std::map<char, char> mp = {
{')', '('},
{']', '['},
{'}', '{'}
};
int n = str.size();
for (int i = 0; i < n; i++) {
char ch = str[i];
if (mp.count(ch) > 0) { //右括号
if (!s.empty() && s.top() == mp[ch]) {
s.pop();
} else {
return false;
}
} else { //左括号
s.push(str[i]);
}
}
return s.empty();
}
void print_result(const std::string& str, bool result) {
std::cout << "input: " << str << std::endl;
std::cout << "output: ";
if (result) {
std::cout << "true" << std::endl;
} else {
std::cout << "false" << std::endl;
}
}
int main()
{
// case1: str="()" ==> true
std::string str = "()";
bool ret = is_valid_parenthesis(str);
print_result(str, ret);
// case2: str = "()[]{}" ==> true
str = "()[]{}";
ret = is_valid_parenthesis(str);
print_result(str, ret);
// case3: str = "(]" ==> false
str = "(]";
ret = is_valid_parenthesis(str);
print_result(str, ret);
// case4: str = "([)]" ==>false
str = "([)]";
ret = is_valid_parenthesis(str);
print_result(str, ret);
// case5: str = "{[]}" ==> true
str = "{[]}";
ret = is_valid_parenthesis(str);
print_result(str, ret);
return 0;
}
代码运行结果:
input: ()
output: true
input: ()[]{}
output: true
input: (]
output: false
input: ([)]
output: false
input: {[]}
output: true