LeetCode百日筑基系列主要是为了练习基础的数据结构与算法,题库全为LeetCode简单题(后面会在其他系列更新中等题和困难题),主要使用C语言和Java编写,前期的题目以完成功能为目的,后续会使用更优的算法以及优化代码块。
20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
C语言:
char pairs(char a) {
if (a == '}') return '{';
if (a == ']') return '[';
if (a == ')') return '(';
return 0;
}
bool isValid(char* s) {
int n = strlen(s);
if (n % 2 == 1) {
return false;
}
int stack[n + 1], top = 0;
for (int i = 0; i < n; i++) {
char ch = pairs(s[i]);
if (ch) {
if (top == 0 || stack[top - 1] != ch) {
return false;
}
top--;
} else {
stack[top++] = s[i];
}
}
return top == 0;
}
解题思路:有效括号字符串的长度,一定是偶数。右括号前面,必须是相对应的左括号,才能抵消。右括号前面,不是对应的左括号,那么该字符串,一定不是有效的括号。那么如遇左括号,则压入栈,如遇右括号,弹出栈顶,两者对应,则抵消。若弹出的栈顶如“{”与“{”不是对应关系则返回false。
Java:
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
}
IsValid()
检查对象变量是否已经实例化,即实例变量的值是否是个有效的对象。
语法IsValid ( objectname )
参数objectname 要检测的对象名
返回值为Boolean。如果指定对象已经创建了对此案实例,那么IsValid()函数返回True,否则返回FALSE。如果参数obejctname的值为NULL,IsValid()函数返回NULL。
isEmpty()
是一个判断数列A是否为空的一个函数。
用法:C = isempty(A):
假如A为空的话,返回的值是1
假如A为非空的话,返回的值是0
pop和peek:
peek,pop都是返回栈顶元素;
peek()函数返回栈顶的元素,但不弹出该栈顶元素;
pop()函数返回栈顶的元素,并且将该栈顶元素出栈
add和push:
add,push都可以向stack中添加元素;
add是继承自Vector的方法,且返回值类型是boolean;
push是Stack自身的方法,返回值类型是参数类类型;
containsKey()方法判断是否包含指定的键名
在HashMap中经常用到containsKey()来判断键(key)是否存在。