1 题目描述
LeetCode原题链接:20. 有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
提示:
- 1 <= s.length <= 1 0 4 10^4 104
- s 仅由括号 ‘()[]{}’ 组成
2 解题思路及代码
2.1 C语言实现
/**
* @note
* 左括号入栈,右括号与栈顶左括号匹配则栈顶左括号出栈
* 合法:循环结束且栈空
* 非法:1.栈空且输入右括号
* 2.输入与栈顶左括号不匹配的右括号
* 3.循环结束且栈非空
* 注意:有效字符串的长度一定为偶数,若字符串的长度为奇数可以直接返回False
*/
typedef struct Snode{
char data;
struct Snode *next;
}SNode, *LinkStack;
bool isValid(char * s){
LinkStack S = NULL;
int n = strlen(s);
if (n % 2 == 1) {
return false;
}
while(*s != '\0'){
if(*s == '(' || *s == '{' || *s == '['){ // 入栈
SNode* p = (SNode*)malloc(sizeof(SNode));
p->data = *s;
p->next = S;
S = p;
}else{
if(S == NULL)
return false;
if((S->data == '(' && *s == ')') || (S->data == '[' && *s == ']') || (S->data == '{' && *s == '}')){
SNode* ptr = S;
S = S->next;
free(ptr);
}else{
return false;
}
}
s++;
}
return S == NULL;
}
复杂度分析:
-
时间复杂度:O(n),n为字符串的长度
-
空间复杂度:O(n),栈中存储的字符数量为n个
2.2 C++语言实现
// 解题思路同C
class Solution {
public:
bool isValid(string& s) {
int str_len = s.size();
if(str_len % 2 == 1){ // 字符串长度为奇数直接返回
return false;
}
unordered_map<char, char> pairs = { // 利用unordered_map容器实现时间复杂度为O(1)的查找
{')', '('},
{'}', '{'},
{']', '['},
};
stack<char> stk;
for(size_t i = 0; i < str_len; i++){ // 也可以使用 for(char &ch : s)遍历字符串 (C++11及以上支持这种用法)
if(pairs.count(s[i]) == 1){ // 当前字符为右括号
if(stk.empty())
return false;
if(stk.top() != pairs[s[i]])
return false;
stk.pop();
}else{
stk.push(s[i]);
}
}
return stk.empty(); // 判断最后栈是否已空
}
};
2.3 Python3语言实现
# 解题思路同C
class Solution:
def isValid(self, s: str) -> bool:
if len(s) % 2 == 1:
return False
pairs = {')': '(', '}': '{', ']': '['}
stack = []
for c in s:
if c in pairs: # 判断的是字典的键,即右括号
if not stack:
return False
elif stack[-1] != pairs[c]:
return False
stack.pop()
else:
stack.append(c)
return stack == []
END