Skip to content

Commit 3dc7845

Browse files
committed
Add Leetcode 20. Valid Parentheses
1 parent 98dacc0 commit 3dc7845

3 files changed

Lines changed: 66 additions & 43 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.dojo.leetcode;
2+
3+
public enum Bracket {
4+
PARENTHESES_OPEN('('),
5+
PARENTHESES_CLOSED(')'),
6+
BRACES_OPEN('{'),
7+
BRACES_CLOSED('}'),
8+
BRACKETS_OPEN('['),
9+
BRACKETS_CLOSED(']');
10+
11+
Bracket(char symbol) {
12+
this.symbol = symbol;
13+
}
14+
private final char symbol;
15+
public char getSymbol() { return symbol; }
16+
17+
public static Bracket fromSymbol(char symbol) {
18+
for (Bracket bracket : Bracket.values()) {
19+
if (bracket.getSymbol() == symbol) return bracket;
20+
}
21+
throw new IllegalArgumentException("Invalid symbol: " + symbol);
22+
}
23+
24+
public boolean isMatching(Bracket other) {
25+
return switch (this) {
26+
case PARENTHESES_OPEN -> other.equals(PARENTHESES_CLOSED);
27+
case BRACES_OPEN -> other.equals(BRACES_CLOSED);
28+
case BRACKETS_OPEN -> other.equals(BRACKETS_CLOSED);
29+
case PARENTHESES_CLOSED, BRACES_CLOSED, BRACKETS_CLOSED -> false;
30+
};
31+
}
32+
}

src/main/java/org/dojo/leetcode/Stacks.java

Lines changed: 14 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -43,53 +43,24 @@ public int[] asteroidCollision(int[] asteroids) {
4343
return stack.reversed().stream().mapToInt(i -> i).toArray();
4444
}
4545

46-
// public boolean isValid(String s) {
47-
// Deque<Bracket> stack = new ArrayDeque<>();
48-
// for (int i = 0; i < s.length(); i++) {
49-
// char c = s.charAt(i);
50-
// Bracket bracket = Bracket.fromSymbol(c);
51-
//
52-
// if (stack.isEmpty()) {stack.push(bracket)}
53-
//
54-
// ;
55-
// }
56-
//
57-
// return false;
58-
// }
59-
60-
enum Bracket {
61-
PARENTHESES('(', ')'),
62-
BRACES('{', '}'),
63-
BRACKETS('[', ']');
64-
65-
Bracket(char openSymbol, char closeSymbol) {
66-
this.openSymbol = openSymbol;
67-
this.closeSymbol = closeSymbol;
68-
}
69-
private final char openSymbol;
70-
public char getOpenSymbol() { return openSymbol; }
46+
public boolean isValid(String s) {
47+
Deque<Character> bracketPairs = new ArrayDeque<>(s.length() / 2 + 1);
48+
for (int i = 0; i < s.length(); i++) {
49+
char c = s.charAt(i);
7150

72-
private final char closeSymbol;
73-
public char getCloseSymbol() { return closeSymbol; }
51+
if (bracketPairs.isEmpty()) {
52+
bracketPairs.push(c);
53+
continue;
54+
}
7455

75-
enum State {
76-
OPEN,
77-
CLOSED
56+
if (isMatching(bracketPairs.peek(), c)) bracketPairs.pop();
57+
else bracketPairs.push(c);
7858
}
7959

80-
public char getSymbol(State state) { return state == State.OPEN ? openSymbol : closeSymbol; }
60+
return bracketPairs.isEmpty();
61+
}
62+
63+
boolean isMatching(char self, char other) { return (self == '(' && other == ')') || (self == '{' && other == '}') || (self == '[' && other == ']'); }
8164

82-
public static Bracket fromSymbol(char symbol) {
83-
for (Bracket bracket : Bracket.values()) {
84-
if (bracket.getOpenSymbol() == symbol || bracket.getCloseSymbol() == symbol) {
85-
return bracket;
86-
}
87-
}
88-
throw new IllegalArgumentException("Unknown symbol: " + symbol);
89-
}
9065

91-
public static boolean isMatching(char openSymbol, char closeSymbol) {
92-
return fromSymbol(openSymbol).getCloseSymbol() == closeSymbol;
93-
}
94-
}
9566
}

src/test/java/org/dojo/leetcode/StacksTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.dojo.leetcode;
22

3+
import org.junit.jupiter.api.Test;
34
import org.junit.jupiter.params.ParameterizedTest;
45
import org.junit.jupiter.params.provider.Arguments;
56
import org.junit.jupiter.params.provider.MethodSource;
@@ -12,6 +13,7 @@
1213
class StacksTests {
1314
private final Stacks sut = new Stacks();
1415

16+
1517
static Stream<Arguments> asteroidCollisionProvider() {
1618
return Stream.of(
1719
Arguments.of(new int[] {5, 10, -5}, new int[] {5, 10}),
@@ -29,4 +31,22 @@ public void asteroidCollision(int[] input, int[] expected) {
2931
System.out.printf("Actual: %s\n", Arrays.toString(actual));
3032
assertArrayEquals(expected, actual);
3133
}
34+
35+
public static Stream<Arguments> dataIsValid() {
36+
return Stream.of(
37+
Arguments.of("()", true),
38+
Arguments.of("()[]{}", true),
39+
Arguments.of("(]", false),
40+
Arguments.of("([])", true)
41+
);
42+
}
43+
44+
45+
@ParameterizedTest
46+
@MethodSource("dataIsValid")
47+
void isValid(String s, boolean expected) {
48+
boolean actual = sut.isValid(s);
49+
System.out.printf("Expected: %s, Actual: %s\n", expected, actual);
50+
assert expected == actual;
51+
}
3252
}

0 commit comments

Comments
 (0)