17. Combinaciones alfabéticas de números de teléfono (recorrido recursivo profundo para resolver viejos problemas clásicos)

Preámbulo

El recorrido recursivo profundo de C++ resuelve el problema de la "combinación de letras de números de teléfono". Esta pregunta examina de manera más exhaustiva. Examina el uso del vector, el recorrido profundo y la competencia recursiva . Espero que pueda ser útil para la gente de hierro.

1. Tema

Enlace: https://leetcode.cn/problems/letter-combinations-of-a-phone-number/

En segundo lugar, la solución

Como se muestra en la figura anterior, tomando "256" como ejemplo, ampliamos la disposición y combinación de los caracteres de las tres cadenas y encontramos que esta estructura es similar a la estructura de un árbol de múltiples bifurcaciones, principalmente para examinar la recorrido de profundidad, por lo que también podemos usar la recursividad para Finalizar.

Ahora que hemos determinado que se puede usar la recursión, necesitamos determinar los parámetros requeridos para la recursión.

Primero, necesitamos crear un vector<string> ret para almacenar las combinaciones de letras que deben devolverse . Al mismo tiempo, necesitamos crear una profundidad size_t para controlar la profundidad de la recursión , y luego crear una combinación de cadenas para almacenar las combinaciones de letras de cada grupo . Por supuesto, también se deben pasar dígitos. de.

Se han determinado los parámetros requeridos, entonces, ¿qué pasa con el proceso recursivo específico?

Tomemos la imagen de arriba "ajm" "ajn" "ajo" como ejemplo para explicar el proceso recursivo en detalle

Tres, el código

Código:

class Solution {
    //获取每个数字对应字符串
    //由于0 1没字符,所以设置成空串
    string get_numberstr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public:
   void Combination(const string& digits,size_t depth,string combinestr,    vector<string>& ret)
   {    
       //depth控制深度,digits的长度就是我们递归的深度
       if(depth==digits.size())
       {
           ret.push_back(combinestr);
           return;
       }
       int digit=digits[depth]-'0';//获取数字字符
       string numberstr=get_numberstr[digit];//获取数字所对应的字符串
       for(auto ch:numberstr)
       {
           Combination(digits,depth+1,combinestr+ch,ret);

       }

   }
    vector<string> letterCombinations(string digits) {
        vector<string> ret;
        if(digits.size()==0)
        {
            return ret;
        }
        size_t depth=0;//控制递归深度
        string combinestr;//存储每组字符串
        Combination(digits,depth,combinestr,ret);
        return ret;
    }
};
logrado con éxito

Supongo que te gusta

Origin blog.csdn.net/zcxmjw/article/details/129538557
Recomendado
Clasificación