注意观察可以发现,后出现的左括号必须先匹配到自己对应的右括号才能符合,因此这里我首先想到的是遍历字符串,将左括号按顺序放入容器中,当遇到一个右括号的时候就匹配容器中的尾部左括号,匹配上则继续。否则返回false,这里需要注意的是第一个字符就是右括号的极端情况处理,容器可以采用vector、stack(栈,先进后出)都可以。
vector代码实现如下:
bool ValidParentheses::isValid(string s) {
vector<char> list;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '[' || s[i] == '(' || s[i] == '{') {
list.push_back(s[i]);
}
else {
if (list.empty()) return false;
if (s[i] == ']' && list.back() == '[') {
list.pop_back();
} else if (s[i] == ')' && list.back() == '(') {
list.pop_back();
} else if (s[i] == '}' && list.back() == '{') {
list.pop_back();
}
else {
return false;
}
}
}
if (list.empty())
return true;
else
return false;
}
stack代码实现如下:
bool ValidParentheses::isValid(string s) {
stack<char> parentheses;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') parentheses.push(s[i]);
else {
if (parentheses.empty()) return false;
if (s[i] == ')' && parentheses.top() != '(') return false;
if (s[i] == ']' && parentheses.top() != '[') return false;
if (s[i] == '}' && parentheses.top() != '{') return false;
parentheses.pop();
}
}
return parentheses.empty();
}
运行结果数据分析:
做IT行业,不管是测试、开发、运维等等,或简单或复杂的算法是必不可少的,也是大家面试工作中的必要环节,这个专栏开始和大家一起来研究著名的LeetCode,里边有上千种最常见的算法,面试工作出现几率很高,值得掌握研究,每次完成博客更新我会同步更新我的个人Github上的代码,每个算法都可以直接运行调试以供掌握,GitHub地址:https://github.com/cuiguangwei/LeetCodeProject.git,欢迎大家一起学习讨论进步!