leetcode_rust/problems_cn/p000_0xx/
p000_017.rs1pub fn letter_combinations(digits: String) -> Vec<String> {
55 letter_combinations_by_pre_allocation(digits)
57 }
59
60#[allow(dead_code)]
65fn letter_combinations_by_match_control_flow(digits: String) -> Vec<String> {
66 use std::str;
67 let mut res: Vec<String> = vec![];
68 for digit in digits.as_bytes() {
69 let letters = match *digit {
70 b'2' => "abc",
71 b'3' => "def",
72 b'4' => "ghi",
73 b'5' => "jkl",
74 b'6' => "mno",
75 b'7' => "pqrs",
76 b'8' => "tuv",
77 b'9' => "wxyz",
78 _ => "",
79 }
80 .as_bytes();
81
82 if res.len() > 0 {
83 let mut temp_res = vec![];
84 for partial in res {
85 for letter in letters {
86 let mut new_partial = partial.clone();
87 new_partial.push(*letter as char);
88 temp_res.push(new_partial);
89 }
90 }
91 res = temp_res;
92 } else {
93 res = letters
94 .iter()
95 .map(|l| str::from_utf8(vec![*l].as_slice()).unwrap().to_string())
96 .collect();
97 }
98 }
99
100 res
101}
102
103#[allow(dead_code)]
109fn letter_combinations_by_pre_allocation(digits: String) -> Vec<String> {
110 use std::str;
111
112 let digits_to_letters: Vec<&[u8]> =
113 vec!["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
114 .iter()
115 .map(|s| s.as_bytes())
116 .collect();
117
118 let mut res: Vec<String> = vec![];
119 for digit in digits.as_bytes() {
120 let letters = digits_to_letters[(*digit - b'2') as usize];
121
122 if res.len() > 0 {
123 let mut temp_res = vec![];
124 for partial in res {
125 for letter in letters {
126 let mut new_partial = partial.clone();
127 new_partial.push(*letter as char);
128 temp_res.push(new_partial);
129 }
130 }
131 res = temp_res;
132 } else {
133 let mut temp: Vec<String> = letters
134 .iter()
135 .map(|l| str::from_utf8(vec![*l].as_slice()).unwrap().to_string())
136 .collect();
137 res.append(&mut temp);
138 }
139 }
140
141 res
142}
143
144#[allow(dead_code)]
151fn letter_combinations_by_pre_allocation_v2(digits: String) -> Vec<String> {
152 use std::str;
153
154 let digits_to_letters: Vec<&[u8]> =
155 vec!["abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
156 .iter()
157 .map(|s| s.as_bytes())
158 .collect();
159
160 let mut res: Vec<String> = vec![];
161 for digit in digits.as_bytes() {
162 let letters = digits_to_letters[(*digit - b'2') as usize];
163
164 res = if res.len() == 0 {
165 letters
166 .iter()
167 .map(|l| str::from_utf8(&[*l]).unwrap().to_string())
168 .collect()
169 } else {
170 let mut temp_res = vec![];
171 for partial in res {
172 for letter in letters {
173 temp_res.push(partial.clone() + str::from_utf8(&[*letter]).unwrap());
174 }
175 }
176 temp_res
177 };
178 }
179
180 res
181}
182
183#[cfg(test)]
184mod tests {
185 use super::letter_combinations;
186 #[test]
187 fn test_letter_combinations() {
188 assert_eq!(
189 letter_combinations(String::from("23")),
190 vec!["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
191 );
192 assert_eq!(letter_combinations(String::from("")), Vec::<String>::new());
193 assert_eq!(letter_combinations(String::from("2")), vec!["a", "b", "c"]);
194 }
195}