-
Notifications
You must be signed in to change notification settings - Fork 0
/
Daily_Coding_Problem-07.cpp
82 lines (71 loc) · 3.59 KB
/
Daily_Coding_Problem-07.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "Daily_Coding_Problem.h"
/* MARK: - SOLUTION ✨ */
class Solution {
public:
// Essa função valida o tamanho do parametro passado, pois se for 0 ou 1, não será um tamanho válido
int validator_size(int size)
{
if (size == 1)
return 1;
return 0;
}
// Essa função é responsável por verificar se os numeros são validos para gerar combinações possiveis (entre 1 e 26)
int validator_number(int number)
{
if (number > 0 && number < 27)
return 1;
return (0);
}
// Essa função vai receber uma string e vai retornar um inteiro que representa a quantidade de possibilidades de decodificação, ex: 111 = 3 (aaa, ka, ak)
int decodalize(string input)
{
int size = input.size(); // Tamanho do input que será passado (length)
int c = 0; // Contador de possibilidades
if (size == 0 || size == 1)
return (validator_size(size)); // Se o tamanho da string for 0 ou 1, retorna 1
else if (size == 2)
{
int number = stoi(input); // Converte string para inteiro (stoi) (https://www.geeksforgeeks.org/converting-strings-numbers-cc/)
if (validator_number(number)) // Se o número for válido
return (2); // Retorna 2 combinações de decodificação (1 + 1, 11), pois a string tem tamanho 2 e o número é válido (1 a 26)
else
return (1); // Retorna 1 combinação de decodificação (1 + 1), pois o número não é válido
}
else
{
int number = stoi(input.substr(0, 2)); // Converte string para inteiro (stoi) e pega os dois primeiros caracteres para criar uma (substr)
c += decodalize(input.substr(2, size - 2)); // Chama a função decodalize novamente, mas agora com a string sem os dois primeiros caracteres
c += decodalize(input.substr(1, size - 1)); // sem primeiro caractere
}
return (c); // retorna a nova combinação de substrings
}
};
int main()
{
Solution solution;
string input;
int c;
std::cout << "Enter a string: ";
std::cin >> input;
c = solution.decodalize(input);
std::cout << "Number of combinations: " << c << std::endl;
return (0);
}
/* MARK: - Alternative solution for Leetcode */
class SolutionLeetcode {
public:
int numDecodings(string s) {
int n = s.size(); // declara o tamanho da string
if (n == 0) return 0; // se a string for vazia, retorna 0 combinações
vector<int> dp(n + 1, 0); // declara um vetor de inteiros com tamanho n + 1 e inicializa com 0
dp[n] = 1; // inicializa o ultimo elemento do vetor com 1
dp[n - 1] = s[n - 1] != '0' ? 1 : 0; // inicializa o penultimo elemento do vetor com 1 se o penultimo caractere da string for diferente de 0, senão inicializa com 0
for (int i = n - 2; i >= 0; i--) { // percorre a string de trás pra frente
if (s[i] == '0') continue; // se o caractere for 0, continua o loop
else dp[i] = (stoi(s.substr(i, 2)) <= 26) ? dp[i + 1] + dp[i + 2] : dp[i + 1]; // se o caractere for diferente de 0,
// converte os dois caracteres para inteiro e verifica se é menor ou igual a 26, se for, soma o elemento atual com o
// elemento seguinte e o elemento atual com o elemento seguinte + 1, senão, soma o elemento atual com o elemento seguinte, ex: 111 = 3 (aaa, ka, ak)
}
return dp[0]; // retorna o primeiro elemento do vetor para saber a quantidade de combinações possiveis de decodificação ex: 111 = 3 (aaa, ka, ak)
}
};