Skip to content

Commit 14de6d5

Browse files
committed
20. Valid Parentheses
```Solution.c bool isValid(char* s) { char stack[10000]; int top = -1; for (int i = 0; s[i]; i++) { if (s[i] == '(' || s[i] == '{' || s[i] == '[') { stack[++top] = s[i]; } else { if (top == -1) return false; char c = stack[top--]; if ((s[i] == ')' && c != '(') || (s[i] == '}' && c != '{') || (s[i] == ']' && c != '[')) { return false; } } } return top == -1; } ``` ```Solution.cpp class Solution { public: bool isValid(string s) { stack<char> stack; for (char c : s) { if (c == '(' || c == '{' || c == '[') { stack.push(c); } else { if (stack.empty()) return false; char top = stack.top(); stack.pop(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return stack.empty(); } }; ``` ```Solution.cs public class Solution { public bool IsValid(string s) { Stack<char> stack = new Stack<char>(); foreach (char c in s) { if (c == '(' || c == '{' || c == '[') { stack.Push(c); } else { if (stack.Count == 0) return false; char top = stack.Pop(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return stack.Count == 0; } } ``` ```Solution.dart class Solution { bool isValid(String s) { List<String> stack = []; for (var c in s.split('')) { if (c == '(' || c == '{' || c == '[') { stack.add(c); } else { if (stack.isEmpty) return false; var top = stack.removeLast(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return stack.isEmpty; } } ``` ```Solution.erl -spec is_valid(S :: unicode:unicode_binary()) -> boolean(). is_valid(S) -> Chars = unicode:characters_to_list(S), Pairs = #{ $) => $(, $] => $[, $} => ${ }, check(Chars, [], Pairs). check([], [], _Pairs) -> true; check([], _Stack, _Pairs) -> false; check([C | Rest], Stack, Pairs) -> case maps:get(C, Pairs, undefined) of undefined -> check(Rest, [C | Stack], Pairs); Open -> case Stack of [Open | Tail] -> check(Rest, Tail, Pairs); _ -> false end end. ``` ```Solution.ex defmodule Solution do @SPEC is_valid(s :: String.t) :: boolean def is_valid(s), do: match_brackets(s, []) defp match_brackets(<<?(, rest::binary>>, stack), do: match_brackets(rest, [?( | stack]) defp match_brackets(<<?[, rest::binary>>, stack), do: match_brackets(rest, [?[ | stack]) defp match_brackets(<<?{, rest::binary>>, stack), do: match_brackets(rest, [?{ | stack]) defp match_brackets(<<?), rest::binary>>, [?( | stack]), do: match_brackets(rest, stack) defp match_brackets(<<?], rest::binary>>, [?[ | stack]), do: match_brackets(rest, stack) defp match_brackets(<<?}, rest::binary>>, [?{ | stack]), do: match_brackets(rest, stack) defp match_brackets("", []), do: true defp match_brackets(_, _), do: false end ``` ```Solution.go func isValid(s string) bool { stack := []rune{} for _, c := range s { if c == '(' || c == '{' || c == '[' { stack = append(stack, c) } else { if len(stack) == 0 { return false } top := stack[len(stack)-1] stack = stack[:len(stack)-1] if (c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[') { return false } } } return len(stack) == 0 } ``` ```Solution.java class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); for (char c : s.toCharArray()) { if (c == '(' || c == '{' || c == '[') { stack.push(c); } else { if (stack.isEmpty()) return false; char top = stack.pop(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return stack.isEmpty(); } } ``` ```Solution.js /** * @param {string} s * @return {boolean} */ var isValid = function(s) { const stack = []; for (const c of s) { if (c === '(' || c === '{' || c === '[') { stack.push(c); } else { if (stack.length === 0) return false; const top = stack.pop(); if ((c === ')' && top !== '(') || (c === '}' && top !== '{') || (c === ']' && top !== '[')) { return false; } } } return stack.length === 0; }; ``` ```Solution.kt class Solution { fun isValid(s: String): Boolean { val stack = mutableListOf<Char>() for (c in s) { if (c == '(' || c == '{' || c == '[') { stack.add(c) } else { if (stack.isEmpty()) return false val top = stack.removeAt(stack.size - 1) if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false } } } return stack.isEmpty() } } ``` ```Solution.php class Solution { /** * @param String $s * @return Boolean */ function isValid($s) { $stack = []; foreach (str_split($s) as $c) { if ($c == '(' || $c == '{' || $c == '[') { array_push($stack, $c); } else { if (empty($stack)) return false; $top = array_pop($stack); if (($c == ')' && $top != '(') || ($c == '}' && $top != '{') || ($c == ']' && $top != '[')) { return false; } } } return empty($stack); } } ``` ```Solution.py class Solution: def isValid(self, s: str) -> bool: stack = [] for c in s: if c in '({[': stack.append(c) else: if not stack: return False top = stack.pop() if (c == ')' and top != '(') or \ (c == '}' and top != '{') or \ (c == ']' and top != '['): return False return len(stack) == 0 ``` ```Solution.rb # @param {String} s # @return {Boolean} def is_valid(s) stack = [] s.each_char do |c| if c == '(' || c == '{' || c == '[' stack.push(c) else return false if stack.empty? top = stack.pop return false if (c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[') end end stack.empty? end ``` ```Solution.rkt (define is-valid (lambda (s) (let ([pairs (make-hash)]) (hash-set! pairs #\) #\() (hash-set! pairs #\] #\[) (hash-set! pairs #\} #\{) (let loop ([chars (string->list s)] [stack '()]) (cond [(null? chars) (null? stack)] [else (define ch (car chars)) (cond [(member ch (list #\( #\[ #\{)) (loop (cdr chars) (cons ch stack))] [(hash-has-key? pairs ch) (and (not (null? stack)) (equal? (hash-ref pairs ch) (car stack)) (loop (cdr chars) (cdr stack)))] [else #f])]))))) (provide is-valid) ``` ```Solution.rs impl Solution { pub fn is_valid(s: String) -> bool { let mut stack = Vec::new(); for c in s.chars() { if c == '(' || c == '{' || c == '[' { stack.push(c); } else { if stack.is_empty() { return false; } let top = stack.pop().unwrap(); if (c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[') { return false; } } } stack.is_empty() } } ``` ```Solution.scala object Solution { import scala.collection.mutable def isValid(s: String): Boolean = { val stack = new Array[Char](s.length) val openBrackets = "({[" var result = true var index = 0 var stackIndex = 0 while (index < s.length && result) { val currentBracket = s.charAt(index) if(currentBracket == '(') { stack(stackIndex) = ')' stackIndex += 1 } else if (currentBracket == '{') { stack(stackIndex) = '}' stackIndex += 1 } else if (currentBracket == '[') { stack(stackIndex) = ']' stackIndex += 1 } else if(stackIndex > 0 && stack(stackIndex-1) == currentBracket) { stackIndex -= 1 } else { result = false } index += 1 } stackIndex == 0 && result } } ``` ```Solution.swift class Solution { func isValid(_ s: String) -> Bool { var stack: [Character] = [] for c in s { if c == "(" || c == "{" || c == "[" { stack.append(c) } else { if stack.isEmpty { return false } let top = stack.removeLast() if (c == ")" && top != "(") || (c == "}" && top != "{") || (c == "]" && top != "[") { return false } } } return stack.isEmpty } } ``` ```Solution.ts function isValid(s: string): boolean { const stack: string[] = []; for (const c of s) { if (c === '(' || c === '{' || c === '[') { stack.push(c); } else { if (stack.length === 0) return false; const top = stack.pop(); if ((c === ')' && top !== '(') || (c === '}' && top !== '{') || (c === ']' && top !== '[')) { return false; } } } return stack.length === 0; } ```
1 parent 3aaf5be commit 14de6d5

19 files changed

+391
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# [**20. Valid Parentheses**](https://leetcode.com/problems/valid-parentheses/description/)
2+
3+
Given a string `s` containing just the characters `'('`, `')'`, `'{'`, `'}'`, `'['` and `']'`, determine if the input string is valid.
4+
5+
An input string is valid if:
6+
1. Open brackets must be closed by the same type of brackets.
7+
2. Open brackets must be closed in the correct order.
8+
3. Every close bracket has a corresponding open bracket of the same type.
9+
10+
#### **Example 1:**
11+
```md
12+
Input: s = "()"
13+
Output: true
14+
```
15+
16+
#### **Example 2:**
17+
```md
18+
Input: s = "()[]{}"
19+
Output: true
20+
```
21+
22+
#### **Example 3:**
23+
```md
24+
Input: s = "(]"
25+
Output: false
26+
```
27+
28+
#### **Example 4:**
29+
```md
30+
Input: s = "([])"
31+
Output: true
32+
```
33+
34+
#### **Example 5:**
35+
```md
36+
Input: s = "([)]"
37+
Output: false
38+
```
39+
40+
#### **Constraints:**
41+
> - `1 <= s.length <= 10⁴`
42+
> - `s` consists of parentheses only `'()[]{}'`.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
bool isValid(char* s) {
2+
char stack[10000];
3+
int top = -1;
4+
for (int i = 0; s[i]; i++) {
5+
if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
6+
stack[++top] = s[i];
7+
} else {
8+
if (top == -1) return false;
9+
char c = stack[top--];
10+
if ((s[i] == ')' && c != '(') ||
11+
(s[i] == '}' && c != '{') ||
12+
(s[i] == ']' && c != '[')) {
13+
return false;
14+
}
15+
}
16+
}
17+
return top == -1;
18+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
bool isValid(string s) {
4+
stack<char> stack;
5+
for (char c : s) {
6+
if (c == '(' || c == '{' || c == '[') {
7+
stack.push(c);
8+
} else {
9+
if (stack.empty()) return false;
10+
char top = stack.top();
11+
stack.pop();
12+
if ((c == ')' && top != '(') ||
13+
(c == '}' && top != '{') ||
14+
(c == ']' && top != '[')) {
15+
return false;
16+
}
17+
}
18+
}
19+
return stack.empty();
20+
}
21+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
public class Solution {
2+
public bool IsValid(string s) {
3+
Stack<char> stack = new Stack<char>();
4+
foreach (char c in s) {
5+
if (c == '(' || c == '{' || c == '[') {
6+
stack.Push(c);
7+
} else {
8+
if (stack.Count == 0) return false;
9+
char top = stack.Pop();
10+
if ((c == ')' && top != '(') ||
11+
(c == '}' && top != '{') ||
12+
(c == ']' && top != '[')) {
13+
return false;
14+
}
15+
}
16+
}
17+
return stack.Count == 0;
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
bool isValid(String s) {
3+
List<String> stack = [];
4+
for (var c in s.split('')) {
5+
if (c == '(' || c == '{' || c == '[') {
6+
stack.add(c);
7+
} else {
8+
if (stack.isEmpty) return false;
9+
var top = stack.removeLast();
10+
if ((c == ')' && top != '(') ||
11+
(c == '}' && top != '{') ||
12+
(c == ']' && top != '[')) {
13+
return false;
14+
}
15+
}
16+
}
17+
return stack.isEmpty;
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
-spec is_valid(S :: unicode:unicode_binary()) -> boolean().
2+
is_valid(S) ->
3+
Chars = unicode:characters_to_list(S),
4+
Pairs = #{ $) => $(, $] => $[, $} => ${ },
5+
check(Chars, [], Pairs).
6+
check([], [], _Pairs) ->
7+
true;
8+
check([], _Stack, _Pairs) ->
9+
false;
10+
check([C | Rest], Stack, Pairs) ->
11+
case maps:get(C, Pairs, undefined) of
12+
undefined ->
13+
check(Rest, [C | Stack], Pairs);
14+
Open ->
15+
case Stack of
16+
[Open | Tail] -> check(Rest, Tail, Pairs);
17+
_ -> false
18+
end
19+
end.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
defmodule Solution do
2+
@spec is_valid(s :: String.t) :: boolean
3+
def is_valid(s), do: match_brackets(s, [])
4+
defp match_brackets(<<?(, rest::binary>>, stack), do: match_brackets(rest, [?( | stack])
5+
defp match_brackets(<<?[, rest::binary>>, stack), do: match_brackets(rest, [?[ | stack])
6+
defp match_brackets(<<?{, rest::binary>>, stack), do: match_brackets(rest, [?{ | stack])
7+
defp match_brackets(<<?), rest::binary>>, [?( | stack]), do: match_brackets(rest, stack)
8+
defp match_brackets(<<?], rest::binary>>, [?[ | stack]), do: match_brackets(rest, stack)
9+
defp match_brackets(<<?}, rest::binary>>, [?{ | stack]), do: match_brackets(rest, stack)
10+
defp match_brackets("", []), do: true
11+
defp match_brackets(_, _), do: false
12+
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func isValid(s string) bool {
2+
stack := []rune{}
3+
for _, c := range s {
4+
if c == '(' || c == '{' || c == '[' {
5+
stack = append(stack, c)
6+
} else {
7+
if len(stack) == 0 {
8+
return false
9+
}
10+
top := stack[len(stack)-1]
11+
stack = stack[:len(stack)-1]
12+
if (c == ')' && top != '(') ||
13+
(c == '}' && top != '{') ||
14+
(c == ']' && top != '[') {
15+
return false
16+
}
17+
}
18+
}
19+
return len(stack) == 0
20+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public boolean isValid(String s) {
3+
Stack<Character> stack = new Stack<>();
4+
for (char c : s.toCharArray()) {
5+
if (c == '(' || c == '{' || c == '[') {
6+
stack.push(c);
7+
} else {
8+
if (stack.isEmpty()) return false;
9+
char top = stack.pop();
10+
if ((c == ')' && top != '(') ||
11+
(c == '}' && top != '{') ||
12+
(c == ']' && top != '[')) {
13+
return false;
14+
}
15+
}
16+
}
17+
return stack.isEmpty();
18+
}
19+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @param {string} s
3+
* @return {boolean}
4+
*/
5+
var isValid = function(s) {
6+
const stack = [];
7+
for (const c of s) {
8+
if (c === '(' || c === '{' || c === '[') {
9+
stack.push(c);
10+
} else {
11+
if (stack.length === 0) return false;
12+
const top = stack.pop();
13+
if ((c === ')' && top !== '(') ||
14+
(c === '}' && top !== '{') ||
15+
(c === ']' && top !== '[')) {
16+
return false;
17+
}
18+
}
19+
}
20+
return stack.length === 0;
21+
};

0 commit comments

Comments
 (0)