[刷 题] Combinaciones de 17 letras de un número de teléfono

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 }
Ver código

  

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?

https://coding.imooc.com/learn/questiondetail/19706.html

Supongo que te gusta

Origin www.cnblogs.com/cxc1357/p/12687008.html
Recomendado
Clasificación