Validate if a given string is numeric.
Some examples: "0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.Solution: This finite-state machine solution. Learn from fuwutu & snakeDling.
1 class Solution { 2 public: 3 bool isNumber(const char *s) { 4 enum InputType {INVALID, SPACE, SIGN, DIGIT, DOT, EXPONENT}; 5 int transitionTable[][6] = 6 { /* 0 1 2 3 4 5 */ 7 0, 1, 2, 3, 4, 0, // 0: INVALID 8 0, 1, 2, 3, 4, 0, // 1: SPACE 9 0, 0, 0, 3, 4, 0, // 2: SIGN10 0, 6, 0, 3, 7, 5, // 3: DIGIT11 0, 0, 0, 7, 0, 0, // 4: DOT12 0, 0, 2, 8, 0, 0, // 5: EXPONENT13 0, 6, 0, 0, 0, 0, // 6: END WITH SPACE14 0, 6, 0, 7, 0, 5, // 7: DOT AND DIGIT15 0, 6, 0, 8, 0, 0, // 8: END WITH SPACE OR DIGIT16 };17 18 InputType last = INVALID;19 while (*s != '\0')20 {21 InputType state = INVALID;22 if (*s == ' ')23 state = SPACE;24 else if (isdigit(*s))25 state = DIGIT;26 else if (*s == '+' || *s == '-')27 state = SIGN;28 else if (*s == 'e')29 state = EXPONENT;30 else if (*s == '.')31 state = DOT;32 last = (InputType) transitionTable[last][state];33 if (last == INVALID) return false;34 s++;35 }36 bool validFinal[] = { 0, 0, 0, 1, 0, 0, 1, 1, 1};37 return validFinal[last];38 }39 };