给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法
Swift:
/**
栈
利用 栈 左括号入栈,右括号对应栈顶左括号出栈,遍历完成后栈为空则true
*/
func isValid(_ s: inout String) -> Bool {
// 过滤数据,单数不成立
guard s.count % 2 != 1 else {
return false
}
var stack = [Character]()
for char in s {
// 左括号入栈
if char == "(" || char == "[" || char == "{" {
stack.append(char)
} else if (char == ")" && stack.last == "(") || (char == "]" && stack.last == "[") || (char == "}" && stack.last == "{") {
stack.popLast()
}
}
return stack.isEmpty
}
func isValid(_ s: inout String) -> Bool {
// 过滤数据,单数不成立
guard s.count % 2 != 1 else {
return false
}
// 括号元素
let map = [")": "(", "]": "[", "}": "{"]
var stack = [Character]()
for char in s {
// 左括号入栈
if map.values.contains(char.description) {
stack.append(char)
// 右括号对应栈顶左括号,出栈
} else if map[char.description] == stack.last?.description {
stack.popLast()
// 不是括号
} else {
return false
}
}
return stack.isEmpty
}
Java
public boolean isValid(final String s) {
// 过滤数据
if(s.length()%2 == 1) return false;
Stack<Character> stack = new Stack<Character>();
for (Character character : s.toCharArray()) {
// 左括号入栈
if(character == '(' || character == '[' || character == '{'){
stack.push(character);
// 右括号与栈顶元素匹配,出栈
} else if(!stack.isEmpty() && ((character == ')' && stack.peek() == '(')
|| (character == ']' && stack.peek() == '[')
|| (character == '}' && stack.peek() == '{'))){
stack.pop();
} else {
return false;
}
}
return stack.isEmpty();
}
public boolean isValid(final String s) {
// 过滤数据
if(s.length()%2 == 1) return false;
Map<Character, Character> map = new HashMap<Character, Character>();
Stack<Character> stack = new Stack<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
for (Character c : s.toCharArray()) {
if (map.containsValue(c)) {
stack.push(c);
} else if (stack.isEmpty()) {
return false;
} else if (map.get(c) == stack.peek()) {
stack.pop();
} else {
return false;
}
}
return stack.isEmpty();
}
网友评论