1const VOWELS: &str = "aeiouy";
2const CONSONANTS: &str = "bcdfghjklmnpqrstvwxz";
3
4pub fn split(word: &str) -> Vec<Vec<String>> {
5 let validate = |syllable: &str| -> bool {
6 let (mut vowels, mut consonants) = (false, false);
7 for c in syllable.chars().map(|c| c.to_ascii_lowercase()) {
8 vowels |= VOWELS.contains(c);
9 consonants |= CONSONANTS.contains(c);
10 if vowels && consonants {
11 return true;
12 }
13 }
14 false
15 };
16
17 let mut results = Vec::new();
18 let mut stack: Vec<(usize, Vec<String>)> = vec![(0, vec![])];
19
20 while let Some((start, state)) = stack.pop() {
21 if start >= word.len() {
22 results.push(state);
23 continue;
24 }
25 for length in 2..=4 {
26 if start + length <= word.len() {
27 let syllable = &word[start..start + length];
28 if validate(syllable) {
29 let mut updated = state.clone();
30 updated.push(syllable.to_string());
31 stack.push((start + length, updated));
32 }
33 }
34 }
35 }
36
37 results.sort();
38 results.dedup();
39 results
40}