今天分享一道简单题,跟栈相关的题目
链接:https://leetcode-cn.com/problems/valid-parentheses
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
题目分析:
给定一个字符串,只包含 () [] {} 等括号,字符串有一定的对称性。需要成对出现,成对“抵消”等等
可以发现,遍历字符串,每遇到一个右符号,就需要关联一个左符号,这里隐隐有两个要求:
- 能取出最近的左符号
- 判断一下左符号和当前的右符号是否匹配
栈一般用来处理 “最近相关” 的问题。栈在逻辑上是 “后进先出”,实际可以用数组来模拟实现。如果你用的编程语言提供栈的实现,也可以用,比如 Java 封装了 Stack 。
我这里用List模拟了栈的后进先出
- 对于每个左符号,都追加到 list 末尾
- 遇到左符号,从末尾取出符号,判断一下是否匹配
代码实现
class Solution {
public boolean isValid(String s) {
List<Character> stack = new ArrayList<>();
int length = s.length();
for (int i = 0 ; i < length; i++) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '{') {
stack.add(c); // 遇到左符号,入栈
} else {
if (stack.size() == 0) {
return false; // 遇到右符号,就从栈取出元素,如果没得取,说明不匹配
}
if (c == ')' && stack.get(stack.size() - 1) != '(' ) {
return false;
}
if (c == ']' && stack.get(stack.size() - 1) != '[' ) {
return false;
}
if (c == '}' && stack.get(stack.size() - 1) != '{' ) {
return false;
}
// 删掉匹配成功的右符号
stack.remove(stack.size() - 1);
}
}
if (stack.size() != 0) {
return false; // 还有剩余的未匹配的左符号,返回 false
}
return true;
}
}
go语言实现
func isValid(s string) bool {
length := len(s)
var stack []byte
for i := 0; i < length; i++ {
c := s[i]
if c == '(' || c == '[' || c == '{' {
stack = append(stack, c)
} else {
if len(stack) == 0 {
return false
}
if c == ')' && stack[len(stack) - 1] != '(' {
return false
}
if c == ']' && stack[len(stack) - 1] != '[' {
return false
}
if c == '}' && stack[len(stack) - 1] != '{' {
return false
}
stack = stack[:len(stack) - 1]
}
}
if len(stack) != 0 {
return false
}
return true
}
本篇完