Skip to content

Commit aa196f7

Browse files
committed
LeetCode - valid-parentheses
1 parent b188547 commit aa196f7

File tree

3 files changed

+216
-0
lines changed

3 files changed

+216
-0
lines changed

LeetCode/valid-parentheses/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

LeetCode/valid-parentheses/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "parse-parens"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
fn main() {
2+
expr_zero_or_more("()");
3+
}
4+
5+
fn expr_zero_or_more(s: &str) -> Option<&str> {
6+
println!("expr_zero_or_more s={}", s);
7+
8+
if s.len() == 0 {
9+
return Some(s);
10+
}
11+
12+
let mut t = s;
13+
while t.len() > 0 {
14+
match expr_parens(t) {
15+
Some(u) => t = u,
16+
None => return None,
17+
}
18+
println!("expr_zero_or_more while t={}", t);
19+
}
20+
Some("")
21+
}
22+
23+
fn expr_one_or_more(s: &str) -> Option<&str> {
24+
println!("expr_one_or_more s={}", s);
25+
26+
let mut t = s;
27+
while t.len() > 0 {
28+
println!("expr_one_or_more while t={}", t);
29+
match expr_parens(t) {
30+
Some(u) => t = u,
31+
None => return Some(t),
32+
}
33+
println!("expr_one_or_more while match t={}", t);
34+
}
35+
Some("")
36+
}
37+
38+
fn expr_parens(s: &str) -> Option<&str> {
39+
println!("expr_parens s={}", s);
40+
assert!(s.len() > 0);
41+
42+
let next = &s[0..1];
43+
match next {
44+
"(" => {
45+
println!("expr_parens s={} match ( &s[1..]={}", s, &s[1..]);
46+
47+
if s.len() == 1 {
48+
return None
49+
}
50+
51+
let peek = &s[1..2];
52+
match peek {
53+
")" => {
54+
println!("expr_parens s={} match ( peek ) &s[2..]={}", s, &s[1..]);
55+
Some(&s[2..])
56+
},
57+
_ => {
58+
59+
let e = expr_one_or_more(&s[1..]);
60+
println!("expr_parens s={} match ( e={:?}", s, e);
61+
match e {
62+
Some(f) => {
63+
if f.len() >= 1 && &f[0..1] == ")" {
64+
println!("expr_parens s={} ( e={:?} return Some(&f[1..])={}", s, e, &f[1..]);
65+
Some(&f[1..])
66+
} else {
67+
None
68+
}
69+
},
70+
None => Some(s)
71+
}
72+
73+
}
74+
}
75+
},
76+
_ => None
77+
}
78+
}
79+
80+
#[cfg(test)]
81+
mod tests {
82+
use super::*;
83+
84+
#[test]
85+
#[should_panic(expected = "assertion failed: s.len() > 0")]
86+
fn test_expr_parens_empty_is_none() {
87+
let input = "";
88+
let result = expr_parens(input);
89+
assert!(result.is_none());
90+
}
91+
92+
#[test]
93+
fn test_expr_parens_pair_is_some() {
94+
let input = "()";
95+
let result = expr_parens(input);
96+
assert!(result.is_some());
97+
}
98+
99+
#[test]
100+
fn test_expr_parens_nested_is_some() {
101+
let input = "(())";
102+
let result = expr_parens(input);
103+
assert!(result.is_some());
104+
}
105+
106+
#[test]
107+
fn test_expr_parens_nesteded_is_some() {
108+
let input = "((()))";
109+
let result = expr_parens(input);
110+
assert!(result.is_some());
111+
}
112+
113+
#[test]
114+
fn test_expr_parens_single_is_none() {
115+
let input = "(";
116+
let result = expr_parens(input);
117+
assert!(result.is_none());
118+
}
119+
120+
#[test]
121+
fn test_empty_is_some() {
122+
let input = "";
123+
let result = expr_zero_or_more(input);
124+
assert!(result.is_some());
125+
}
126+
127+
#[test]
128+
fn test_single_is_none() {
129+
let input = "(";
130+
let result = expr_zero_or_more(input);
131+
assert!(result.is_none());
132+
}
133+
134+
#[test]
135+
fn test_parens_is_some() {
136+
let input = "()";
137+
let result = expr_zero_or_more(input);
138+
assert!(result.is_some());
139+
}
140+
141+
#[test]
142+
fn test_parens_pairs_is_some() {
143+
let input = "()()";
144+
let result = expr_zero_or_more(input);
145+
assert!(result.is_some());
146+
}
147+
148+
#[test]
149+
fn test_expr_zero_or_more_3_parens_pairs_is_some() {
150+
let input = "()()()";
151+
let result = expr_zero_or_more(input);
152+
assert!(result.is_some());
153+
}
154+
155+
#[test]
156+
fn test_parens_nested_is_some() {
157+
let input = "(())";
158+
let result = expr_zero_or_more(input);
159+
assert!(result.is_some());
160+
}
161+
162+
#[test]
163+
fn test_parens_nesteded_is_some() {
164+
let input = "((()))";
165+
let result = expr_zero_or_more(input);
166+
assert!(result.is_some());
167+
}
168+
169+
#[test]
170+
fn test_parens_extra_open_is_none() {
171+
let input = "()(";
172+
let result = expr_zero_or_more(input);
173+
assert!(result.is_none());
174+
}
175+
176+
#[test]
177+
fn test_parens_pair_extra_open_is_none() {
178+
let input = "()()(";
179+
let result = expr_zero_or_more(input);
180+
assert!(result.is_none());
181+
}
182+
183+
#[test]
184+
fn test_parens_nested_pair_extra_open_is_none() {
185+
let input = "(())(()())(";
186+
let result = expr_zero_or_more(input);
187+
assert!(result.is_none());
188+
}
189+
190+
#[test]
191+
fn test_parens_complex_is_some() {
192+
let input = "(())(()())()";
193+
let result = expr_zero_or_more(input);
194+
assert!(result.is_some());
195+
}
196+
197+
#[test]
198+
fn test_parens_extra_closed_is_none() {
199+
let input = "())";
200+
let result = expr_zero_or_more(input);
201+
assert!(result.is_none());
202+
}
203+
}

0 commit comments

Comments
 (0)