Skip to content

Commit 8e442c2

Browse files
committed
10
1 parent b07b27c commit 8e442c2

File tree

3 files changed

+41
-60
lines changed

3 files changed

+41
-60
lines changed

.idea/workspace.xml

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

src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ mod weeklies;
1212
//mod p0007;
1313
//mod p0008;
1414
//mod p0009;
15-
//mod p0010;
15+
mod p0010;
1616

1717

1818
fn main() {
19-
//let test = p0009::Solution::is_palindrome(121);
19+
let test = p0010::Solution::is_match("".to_string(),".*".to_string());
2020
println!("{}","");
2121
}

src/p0010.rs

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,71 +2,53 @@
22
pub(crate) struct Solution;
33

44
enum Token {
5-
Char(u8),
5+
Char(char),
66
Star(Box<Token>),
77
Dot
88
}
99

10-
#[derive(Clone)]
11-
enum Match {
12-
None,
13-
One(usize),
14-
Star(StarMatch)
15-
}
16-
17-
#[derive(Clone)]
18-
struct StarMatch {
19-
index:usize,
20-
length:usize,
10+
impl Token {
11+
fn consumes(&self, c:&char) -> bool {
12+
match self {
13+
Token::Char(tc) => *tc == *c,
14+
Token::Star(t) => t.consumes(c),
15+
Token::Dot => true
16+
}
17+
}
2118
}
2219

2320
impl Solution {
2421
pub fn is_match(s: String, p: String) -> bool {
25-
let chars = s.as_bytes();
22+
let chars:Vec<char> = s.chars().collect();
2623
let pattern = Solution::parse_pattern(p);
27-
let mut matches = vec![Match::None; pattern.len()];
28-
29-
let mut token_i = 0;
30-
let mut char_i = 0;
31-
loop {
32-
matches[token_i] = match &pattern[token_i] {
33-
Token::Char(c) if c == chars[char_i] => unimplemented!(),
34-
Token::Star(t) => unimplemented!(),
35-
Token::Dot => unimplemented!(),
36-
}
37-
}
3824

39-
unimplemented!()
25+
Solution::matches(pattern.as_slice(), chars.as_slice())
4026
}
4127

42-
fn char(c: &char, i: &mut usize, chars: &Vec<char>) -> bool {
43-
if chars[*i] == *c {
44-
*i += 1;
45-
true
46-
} else {
47-
false
48-
}
49-
}
5028

51-
fn dot(i: &mut usize) -> bool {
52-
*i += 1;
53-
true
29+
fn matches(pattern: &[Token], chars: &[char]) -> bool {
30+
for (i,t) in pattern.iter().enumerate() {
31+
if let Token::Star(t) = t {
32+
let mut ii = i;
33+
if Solution::matches(&pattern[i + 1..], &chars[ii..]){
34+
return true;
35+
}
36+
while ii < chars.len() && t.consumes(&chars[ii]) {
37+
if Solution::matches(&pattern[i + 1..], &chars[ii+1..]){
38+
return true;
39+
}
40+
ii+=1;
41+
}
42+
return false;
43+
} else if i>= chars.len() || !t.consumes(&chars[i]) {
44+
return false;
45+
}
46+
}
47+
pattern.len() == chars.len()
5448
}
5549

56-
// fn matcher(t: &Token, i: &mut usize, chars: &Vec<char>) -> Match {
57-
// match t {
58-
// Token::Char(c) => if *i >= chars.len() || !Solution::char(c, i, chars) { return false; }
59-
// Token::Dot => if *i >= chars.len() || !Solution::dot(i) { return false; }
60-
// Token::Star(t) => {
61-
// //TODO make less greedy
62-
// while Solution::matcher(t, i, chars) {}
63-
// }
64-
// }
65-
// return true
66-
// }
67-
6850

69-
fn parse_pattern<'a>(p: String) -> Vec<Token> {
51+
fn parse_pattern(p: String) -> Vec<Token> {
7052
let mut pattern: Vec<Token> = Vec::with_capacity(p.len());
7153

7254
for c in p.chars() {

0 commit comments

Comments
 (0)