class Solution {
public:
bool isNumber(string s) {
enum InputType {
INVALID, SPACE, SIGN, DOT, E, DIGIT, LEN
};
int trans[][LEN] = {
{-1, 0, 1, 2, -1, 3},
{-1, -1, -1, 2, -1, 3},
{-1, -1, -1, -1, -1, 4},
{-1, 5, -1, 4, 6, 3},
{-1, 5, -1, -1, 6, 4},
{-1, 5, -1, -1, -1, -1},
{-1, -1, 7, -1, -1, 8},
{-1, -1, -1, -1, -1, 8},
{-1, 5, -1, -1, -1, 8}
};
int state = 0;
int p=0;
while (p<s.length()) {
InputType input;
if (isspace(s[p])) {
input = SPACE;
} else if (s[p] == '+' || s[p] == '-') {
input = SIGN;
} else if (s[p] == '.') {
input = DOT;
} else if (s[p] == 'e' || s[p] == 'E') {
input = E;
} else if (isdigit(s[p])) {
input = DIGIT;
} else {
input = INVALID;
}
state = trans[state][input];
if (state == -1) {
return false;
}
p++;
}
return state == 3 || state == 4 || state == 5 || state == 8;
}
};