Solicitud
- Dada una
2-9
cadena que contiene solo números , devuelve todas las combinaciones de letras que puede representar - 1 no corresponde a ninguna letra
Ejemplos
- Ingrese: "23"
- 输出 : ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
Ideas
- Recursivamente genera todas las cadenas posibles una por una
- s (dígitos) es la cadena que los dígitos pueden generar
Lograr
1 #include <vector> 2 #include <iostream> 3 #include < string > 4 #include <afirmar.h> 5 6 usando el espacio de nombres std; 7 Solución de 8 clases { 9 10 privado : 11 const string letterMap [ 10 ] = { 12 " " , 13 "" , 14 " abc " , 15 " def " , 16 "ghi " , 17 " jkl " , 18 " mno " , 19 " pqrs " , 20 " tuv " , 21 " wxyz " 22 }; 23 24 vector < string > res; 25 // Procese el dígito índice 26 // s Guarde la cadena generada por los dígitos [0 ... index-1] 27 // Encuentre las letras que coinciden con los dígitos [index] y obtenga la solución generada por los dígitos [0 ... index] 28 void findCombination ( const string & digits, int index, const string & s) { 29 30 cout << index << " : " << s << endl; 31 32 // 终止 条件 33 if (index == digits.size ()) { 34 // s 是 一个 解 , 保存 35 res.push_back (s); 36 cout << " get " << s << " , return " << endl; 37 regreso ; 40 de char c = dígitos [índice]; 41 aserción (c> = ' 0 ' && c <= ' 9 ' && c! = ' 1 ' ); 42 letras de cadena = letterMap [c- ' 0 ' ]; 43 44 para ( int i = 0 ; i <letters.size (); i ++ ) { 45 cout << " digits [ " << index << " ] = " << c << "<< letras [i] << endl; 46 // 处理 第 índice + 1 位 数字 47 findCombination (dígitos, índice + 1 , s + letras [i]); 48 } 49 cout << " dígitos [ " << index << " ] = " << c << " complete, return " << endl; 50 regreso ; 51 } 52 public : 53 vector < string > 初始化 56 res.clear (); 57 // 边界 情况 58 if (dígitos == "" ) 59 return res; 60 61 findCombination (dígitos, 0 , "" ); 62 63 retorno res; 64 } 65 }; 66 67 int main () { 68 69 vector < string > res = Solution (). LetterCombinations ( " 23 " ); 70 para ( int i =0 ; i <res.size (); i ++ ) 71 cout << res [i] << endl; 72 73 devuelve 0 ; 74 }
Resumen
- La esencia es dar marcha atrás, que es una solución de enumeración violenta
- El retroceso es una idea algorítmica que se puede implementar de forma recursiva
- La diferencia con los múltiples bucles es que se desconoce la longitud del carácter a procesar
- La esencia de la programación dinámica es mejorar sobre la base del retroceso para aumentar la eficiencia.
- Complejidad: 3 ^ n (O (2 ^ n), n letras, 3 letras por número)
- Baja eficiencia, computadora en casa n <20
Relacionados
- 93 Restaurar direcciones IP
- 131 Particionamiento Palindrome
Referencia
¿Cuál es la diferencia entre recursividad y retroceso? ¿Cómo distinguir?