题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
解题思路:
使用栈。
1)遍历字符串,左括号入栈;
2)如果遇到是右括号,则出栈,并判断出栈的字符和该右括号是否是同类型括号,是则下一个字符,否,则返回false;
3)最后判断栈是否为空,空则返回true,反之,返回false。
C++代码:
class Solution {
public:
bool isValid(string s) {
/***
先进后出,用栈
遍历字符串,遇到左符号,入栈,遇到右符号出栈,并判断是否相等。
***/
// 先备份符号配对关系
map<char, char> left_right_map;
left_right_map['('] = ')';
left_right_map['{'] = '}';
left_right_map['['] = ']';
// 特殊情况
if (s.size() <= 1) return false;
vector<char> stack;
for (int i = 0; i < s.size(); i++)
{
// 判断左右符号
if (left_right_map.find(s[i]) != left_right_map.end()) stack.push_back(s[i]); // 找到了,即是左
else // 则是右符号
{
// 出栈,判断出栈的左符号,和当前的右符号是否匹配
if (stack.empty()) return false;
else{
char cur_left = stack[stack.size() - 1];
stack.pop_back(); // 出栈顶元素,即左符号
if (left_right_map[cur_left] == s[i]) continue;// 左右符号是否相等
else return false;
}
}
}
if (stack.size() != 0) return false;
return true;
}
};
python代码:
执行用时:20 ms, 在所有 Python 提交中击败了56.10%的用户
内存消耗:13.2 MB, 在所有 Python 提交中击败了31.95%的用户
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: bool
"""
# 备份左右符号匹配关系
left_right_dict = {
"(": ")",
"{": "}",
"[": "]"
}
# 处理特殊情况
if len(s) <= 1: return False
# 遍历字符串
left_stack = []
for i in range(len(s)):
# 判断左右字符
if s[i] in left_right_dict.keys():
left_stack.append(s[i]) # 左符号入栈
else:
# 右符号出栈,并判断出栈的左符号和当前右符号是否匹配.
if len(left_stack) == 0: return False
if left_right_dict[left_stack[-1]] == s[i]:
del left_stack[-1] # 出栈了
continue
else: return False
# 如果存放左符号的栈不空,则说明多了左符号
if len(left_stack) == 0:
return True
else:
return False