看到这样的题目,涉及到对应的匹配,一般都会用stack的特性来实现,后入先出(LIFO)Last in, First out.
但是题目要求有几种特殊的情况需要考虑 :
case 1:
输入:s = "()"
输出:true
case 2:
输入:s = "()[]{}"
输出:true
case 3:
输入:s = "(]"
输出:false
case 4:
输入:s = "([)]"
输出:false
case 5:
输入:s = "{[]}"
输出:true其中特殊的情况是case 2和case 5是典型的两种特殊情况,需要考虑。
大概的思路就是 : 左边的括号先stack.push,如果遇到右边的括号需要判断栈顶stack.top 是否相等,如果不等则return false, 如果== 则 stack.pop, 最终看stack.empty() 是否为空,如果不为空,则括号不匹配。
题解
解决这种题目最好是用C++实现,毕竟使用C语言的逻辑会更加麻烦和复杂一些。C语言中没有现成的stack结构。
比如在面试的过程中,一眼看到这种题目,最容易想到的应该使用栈这种结构遍历判断,
需要注意的括号的匹配判断,这里使用一个tips,如果是左括号,需要把右括号 stack.push,不然会出现case 4 样例的bug,不知道stack 里面的括号匹配
class Solution {
public:
/**
*
* @param s string字符串
* @return bool布尔型
*/
bool isValid(string s) {
// write code here
stack<char> str;
for(int i = 0; i<s.size(); i++){
//这里使用一个tips,如果是左括号,需要把右括号 stack.push
if(s[i] == '('){
str.push(')');
}else if(s[i] == '['){
str.push(']');
}else if(s[i] == '{'){
str.push('}');
}else if(str.empty() || str.top() != s[i]){
// 判断右边的括号是否和str.top()相等
return false;
}else{
str.pop();
}
}
return str.empty();
}
};官方的题解的效率会更高。其中括号的匹配搜索使用unordered_map的结构存储来进行遍历
class Solution {
public:
/**
*
* @param s string字符串
* @return bool布尔型
*/
bool isValid(string s) {
// write code here
if(s.size()%2 == 1){
return false;
}
stack<char> str;
unordered_map<char, char> hash_map = {
{')','('},
{'}','{'},
{']','['}
};
for(char ch : s){
//统计key值在unordered_map中出现的次数。实际上,c++ unordered_map不允许有重复的key。因此,如果key存在,则count返回1,如果不存在,则count返回0.
if(hash_map.count(ch)){
if(str.empty() || str.top() != hash_map[ch]){
return false;
}
str.pop();
}else{
str.push(ch);
}
}
return str.empty();
}
};思考过程 :
刚开始看到题目,并没有大概的思路,总是在纠结case 2 以及 case 5的情况,没有好的思路,看了别人的讲解之后,恍然大雾,其实核心的判断原则就是 : **左边的括号先stack.push,如果遇到右边的括号需要判断栈顶stack.top 是否相等,如果不等则return false, 如果== 则 stack.pop, 最终看stack.empty() 是否为空,如果不为空,则括号不匹配。
参考题解:
以上的记录属于解题过程中一些记录,如果侵权,请联系我删除。

京公网安备 11010502036488号