diff --git a/091_decode_ways/Makefile b/091_decode_ways/Makefile new file mode 100644 index 0000000..165f550 --- /dev/null +++ b/091_decode_ways/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test decode_ways.c diff --git a/091_decode_ways/decode_ways.c b/091_decode_ways/decode_ways.c new file mode 100644 index 0000000..4f374fb --- /dev/null +++ b/091_decode_ways/decode_ways.c @@ -0,0 +1,70 @@ +#include +#include +#include + +//static void recursive(char *s, char *stack, int len, char **results, int *count) +//{ +// if (*s == '\0') { +// printf("%s\n", stack); +// results[*count] = malloc(len + 1); +// strcpy(results[*count], stack); +// (*count)++; +// } else { +// //while (*s != '\0') { +// stack[len++] = *s - '0' - 1 + 'A'; +// recursive(s + 1, stack, len, results, count); +// stack[--len] = '\0'; +// if (*(s + 1) != '\0') { +// int value = (*s - '0') * 10 + (*(s + 1) - '0'); +// char c = (value - 1) + 'A'; +// if (c >= 'A' && c <= 'Z') { +// stack[len++] = c; +// recursive(s + 2, stack, len, results, count); +// stack[--len] = '\0'; +// //s++; +// } +// } +// //s++; +// //} +// } +//} + +static void recursive(char *s, int *count) +{ + int value; + char c; + if (*s == '\0') { + (*count)++; + } else { + value = *s - '0'; + c = (value - 1) + 'A'; + if (c >= 'A' && c <= 'Z') { + recursive(s + 1, count); + } + if (*(s + 1) != '\0' && *s != '0') { + value = (*s - '0') * 10 + (*(s + 1) - '0'); + c = (value - 1) + 'A'; + if (c >= 'A' && c <= 'Z') { + recursive(s + 2, count); + } + } + } +} + +static int numDecodings(char* s) { + int count = 0; + if (*s != '\0' && *s != '0') { + recursive(s, &count); + } + return count; +} + +int main(int argc, char **argv) +{ + if (argc != 2) { + fprintf(stderr, "Usage: ./test number\n"); + exit(-1); + } + printf("%d\n", numDecodings(argv[1])); + return 0; +}