注意观察可以发现,后出现的左括号必须先匹配到自己对应的右括号才能符合,因此这里我首先想到的是遍历字符串,将左括号按顺序放入容器中,当遇到一个右括号的时候就匹配容器中的尾部左括号,匹配上则继续。否则返回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,欢迎大家一起学习讨论进步!