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);
}
}
};