解题思路:
借助栈,碰到左括号入栈,碰到右括号弹出栈顶元素进行匹配
输出为False的几种情况
- 栈为空,但仍有待匹配的右括号;
- 栈不为空,字符序列空了,存在未匹配的左括号;
- 栈顶括号和右括号不匹配
- 输入:s = "([)]"
输出:false
示例 5: - 输入:s = "{[]}"
输出:true
具体的算法如下:
//b站代码随想录的步骤
注:首先判断字符串长度是否为奇数,如果是,则返回false。
- 定义一个栈用来存储左括号。
- 遍历字符串,判断每一个字符是否为左括号,是的话将其以对应匹配的右括号形式存入栈中。
- 如果是右括号,则判断栈是否为空。如果为空,则说明没有相应的左括号与之匹配,字符串s无效,返回false。
- 如果栈不为空,则取出栈顶先前存放的左括号对应的右括号与其进行比较并判断它们是否是相同类型的括号。如果不是相同的类型,说明括号不匹配,字符串s无效,返回false。
- 遍历结束后,如果栈为空,则说明所有的括号都已经匹配完毕,字符串s有效,返回true;否则,说明还有未匹配的左括号,字符串s无效,返回false。
另外,还可以使用字符串的replace函数来解决这个问题。(通过上网查询得到)
该方法的具体实现步骤是:
- 使用replace函数将字符串s中的所有‘()’替换为空字符串,将‘{}’替换为空字符串,将‘[]’替换为空字符串。
- 如果替换之后的字符串与原字符串s相同,则说明没有括号可以替换了,字符串s有效,返回true;否则,说明还存在未匹配的括号,字符串s无效,返回false。
以下是方法一的代码实现。
bool isValid(string s) {
stack<char> stk;
for (char ch : s) {
if (ch == '(' || ch == '[' || ch == '{') {
stk.push(ch);
} else {
if (stk.empty()) {
return false;
}
char top = stk.top();
if ((ch == ')' && top == '(') || (ch == ']' && top == '[') || (ch == '}' && top == '{')) {
stk.pop();
} else {
return false;
}
}
}
return stk.empty();
}
此算法时间复杂度为O(n)其中n是字符串的长度。