1
impl Solution {
2
pub fn is_valid(code: String) -> bool {
3
Self::_is_valid(code.as_bytes()).unwrap_or(false)
4
}
5

6
fn _is_valid(code: &[u8]) -> Option<bool> {
7
let mut s = String::new();
8
let mut i = 0;
9
while i < code.len() {
10
if code[i] == b'<' && code.get(i + 1)? == &b'!' {
11
let mut t = String::new();
12
for (j, &item) in code.iter().enumerate().skip(i + 2) {
13
if j - i == 9 {
14
break;
15
}
16
t.push(item as char);
17
}
18
if t == "[CDATA[" || t == "[cdata[" {
19
i += 7;
20
while i < code.len() {
21
if code[i - 2] == b']' && code[i - 1] == b']' && code[i] == b'>' {
22
break;
23
}
24
i += 1;
25
}
26
s.push('#');
27
} else {
28
return Some(false);
29
}
30
} else {
31
s.push(code[i] as char);
32
}
33
i += 1;
34
}
35

36
let s = s.as_bytes();
37

38
if s.is_empty() || s[0] != b'<' {
39
return Some(false);
40
}
41

42
let mut st = Vec::new();
43
let mut k = 0;
44
let mut n = 0;
45
i = 0;
46
while i < s.len() {
47
if s[i] == b'<' {
48
let mut t = String::new();
49
n = 0;
50
if i == s.len() {
51
return Some(false);
52
}
53

54
if s.get(i + 1)? == &b'/' {
55
i += 2;
56
while i < s.len() {
57
let &s_i_byte = s.get(i)?;
58
if s_i_byte == b'>' {
59
break;
60
}
61
if !(b'A'..=b'Z').contains(&s_i_byte) {
62
return Some(false);
63
}
64
t.push(s_i_byte as char);
65
if t.len() == 10 {
66
return Some(false);
67
}
68
i += 1;
69
}
70

71
if st.is_empty() || st.pop().unwrap() != t {
72
return Some(false);
73
}
74
} else {
75
i += 1;
76
while i < s.len() {
77
let &s_i_byte = s.get(i)?;
78
if s_i_byte == b'>' {
79
break;
80
}
81
if !(b'A'..=b'Z').contains(&s_i_byte) {
82
return Some(false);
83
}
84
t.push(s_i_byte as char);
85
if t.len() == 10 {
86
return Some(false);
87
}
88
i += 1;
89
}
90

91
if t.is_empty()
92
|| (st.is_empty() && {
93
k += 1;
94
k == 2
95
})
96
{
97
return Some(false);
98
}
99
st.push(t);
100
}
101
} else {
102
n = 1;
103
}
104
i += 1;
105
}
106
Some(st.is_empty() && n == 0)
107
}
108
}

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0