给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
输入: "()"
输出: true
输入: "()[]{}"
输出: true
输入: "(]"
输出: false
输入: "([)]"
输出: false
输入: "{[]}"
输出: true
栈的思想
- 遍历字符串
- 当前栈的空间长度为0,则直接将该字符串c添加到空间中
- 如果栈空间长度不为0,就意味着有其他字符串,将c与上一个入栈的字符进行isSym进行匹配,如果满足则,将上一个入栈的字符串移除
- 如果不满足以上两个条件,则将c入栈
let isValid = s => {
let isSym = (c1, c2) => {
return (c1 === '(' && c2 === ')')
|| (c1 === '{' && c2 === '}')
|| (c1 === '[' && c2 === ']')
}
let stack = []
for (let i = 0; i < s.length; i++) {
let c = s[i];
if (stack.length === 0) {
stack.push(c);
} else if (isSym(stack[stack.length - 1], c)) {
stack.pop();
} else {
stack.push(c);
}
}
return stack.length === 0;
};func isValid(s string, i int, j int) bool {
// 栈
var stack []string
isSym := func (c1, c2 string) bool {
return (c1 == "(" && c2 == ")") || (c1 == "{" && c2 == "}") || (c1 == "[" && c2 == "]")
}
for _, c := range s {
if stack == nil || len(stack) == 0 || !isSym(stack[len(stack)-1], string(c)) {
stack = append(stack, string(c))
} else {
stack = stack[:len(stack) - 1]
}
}
return len(stack) == 0
}class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()){
if (stack.isEmpty())
stack.push(c);
else if(isSym(stack.peek(), c))
stack.pop();
else
stack.push(c);
}
return stack.isEmpty();
}
private boolean isSym(char c1, char c2) {
return (c1 == '(' && c2 == ')')
|| (c1 == '{' && c2 == '}')
|| (c1 == '[' && c2 == ']');
}
}