[Backtracking] [leetcode] La k-ésima cadena más pequeña en orden lexicográfico entre las cadenas felices de longitud n

tema:

Una "cadena feliz" se define como:

  • Contiene solo letras minúsculas ['a', 'b', 'c'].
  • Para todo i entre 1 y s.length-1, satisfaga s [i]! = S [i + 1] (el subíndice de la cadena comienza en 1).

Por ejemplo, las cadenas "abc", "ac", "b" y "abcbabcbcb" son todas cadenas felices, pero "aa", "baa" y "ababbc" no son cadenas felices.

Dados dos números enteros n y k, debe ordenar todas las cadenas felices de longitud n en orden lexicográfico.

Devuelva la k-ésima cadena feliz después de ordenar. Si hay menos de k cadenas felices de longitud n, devuelva una cadena vacía.

inmediato:

  • 1 <= n <= 10
  • 1 <= k <= 100

Ejemplo 3:

Entrada: n = 3, k = 9
Salida: "cab"
Explicación: Hay un total de 12 cadenas felices de longitud 3 ["aba", "abc", "aca", "acb", "bab", "bac "," bca "," bcb "," cab "," cac "," cba "," cbc "]. La novena cuerda es "cab"

Si k = 13, devuelve "".

fuente:

1415. La k-ésima cadena más pequeña en orden lexicográfico entre las cadenas felices de longitud n

Ideas para resolver problemas: retroceder

  • Condición de terminación recursiva: la longitud de la ruta es igual an
  • Condición de resultado: cuando termina la recursividad, la k-ésima agrega una variable de conteo cnt.
  • Poda: cuando se cumple la condición de resultado, se debe salir de toda recursividad, es decir, cuando el recuento> k.
  • Parámetros recursivos: el carácter actual se pasará y el siguiente carácter posible se puede determinar de acuerdo con el carácter entrante durante la recursividad. El siguiente carácter posible forma un conjunto de caracteres y está representado por una cadena.
class Solution {
public:
    string result;
    string path;
    int cnt;
    string getHappyString(int n, int k) {
        cnt = 0;
        result.clear();
        back(0, n, k);
        return result;
    }
    void back(char prev, int n, int k) {
        if (n == 0) { // 终止
            cnt++;
            if (cnt == k) result = path; // 结果满足
            return;
        }
        string s("abc");
        if (prev == 'a') s = "bc";
        else if (prev == 'b') s = "ac";
        else if (prev == 'c') s = "ab";
        for (int i = 0; i < s.size(); i++) {
            if (cnt > k) break; // 剪枝
            path.push_back(s[i]);
            back(s[i], n - 1, k);
            path.resize(path.size() - 1);
        }
    }
};

 

Supongo que te gusta

Origin blog.csdn.net/hbuxiaoshe/article/details/114899749
Recomendado
Clasificación