pub fn letter_combinations(digits: String) -> Vec<String> {
letter_combinations_by_pre_allocation(digits)
}
#[allow(dead_code)]
fn letter_combinations_by_match_control_flow(digits: String) -> Vec<String> {
use std::str;
let mut res: Vec<String> = vec![];
for digit in digits.as_bytes() {
let letters = match *digit {
b'2' => "abc",
b'3' => "def",
b'4' => "ghi",
b'5' => "jkl",
b'6' => "mno",
b'7' => "pqrs",
b'8' => "tuv",
b'9' => "wxyz",
_ => "",
}
.as_bytes();
if res.len() > 0 {
let mut temp_res = vec![];
for partial in res {
for letter in letters {
let mut new_partial = partial.clone();
new_partial.push(*letter as char);
temp_res.push(new_partial);
}
}
res = temp_res;
} else {
res = letters
.iter()
.map(|l| str::from_utf8(vec![*l].as_slice()).unwrap().to_string())
.collect();
}
}
res
}
#[allow(dead_code)]
fn letter_combinations_by_pre_allocation(digits: String) -> Vec<String> {
use std::str;
let digits_to_letters: Vec<&[u8]> =
vec!["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
.iter()
.map(|s| s.as_bytes())
.collect();
let mut res: Vec<String> = vec![];
for digit in digits.as_bytes() {
let letters = digits_to_letters[(*digit - b'2') as usize];
if res.len() > 0 {
let mut temp_res = vec![];
for partial in res {
for letter in letters {
let mut new_partial = partial.clone();
new_partial.push(*letter as char);
temp_res.push(new_partial);
}
}
res = temp_res;
} else {
let mut temp: Vec<String> = letters
.iter()
.map(|l| str::from_utf8(vec![*l].as_slice()).unwrap().to_string())
.collect();
res.append(&mut temp);
}
}
res
}
#[allow(dead_code)]
fn letter_combinations_by_pre_allocation_v2(digits: String) -> Vec<String> {
use std::str;
let digits_to_letters: Vec<&[u8]> =
vec!["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
.iter()
.map(|s| s.as_bytes())
.collect();
let mut res: Vec<String> = vec![];
for digit in digits.as_bytes() {
let letters = digits_to_letters[(*digit - b'2') as usize];
res = if res.len() == 0 {
letters
.iter()
.map(|l| str::from_utf8(&[*l]).unwrap().to_string())
.collect()
} else {
let mut temp_res = vec![];
for partial in res {
for letter in letters {
temp_res.push(partial.clone() + str::from_utf8(&[*letter]).unwrap());
}
}
temp_res
};
}
res
}
#[cfg(test)]
mod tests {
use super::letter_combinations;
#[test]
fn test_letter_combinations() {
assert_eq!(
letter_combinations(String::from("23")),
vec!["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
);
assert_eq!(letter_combinations(String::from("")), Vec::<String>::new());
assert_eq!(letter_combinations(String::from("2")), vec!["a", "b", "c"]);
}
}