forked from kamyu104/LintCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
valid-number.cpp
73 lines (69 loc) · 2.46 KB
/
valid-number.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
// Time: O(n)
// Space: O(1)
// automata: http://images.cnitblog.com/i/627993/201405/012016243309923.png
class Solution {
public:
/**
* @param s the string that represents a number
* @return whether the string is a valid number
*/
bool isNumber(string& s) {
enum InputType {
INVALID, // 0
SPACE, // 1
SIGN, // 2
DIGIT, // 3
DOT, // 4
EXPONENT, // 5
NUM_INPUTS // 6
};
int transitionTable[][NUM_INPUTS] = {
-1, 0, 3, 1, 2, -1, // next states for state 0
-1, 8, -1, 1, 4, 5, // next states for state 1
-1, -1, -1, 4, -1, -1, // next states for state 2
-1, -1, -1, 1, 2, -1, // next states for state 3
-1, 8, -1, 4, -1, 5, // next states for state 4
-1, -1, 6, 7, -1, -1, // next states for state 5
-1, -1, -1, 7, -1, -1, // next states for state 6
-1, 8, -1, 7, -1, -1, // next states for state 7
-1, 8, -1, -1, -1, -1, // next states for state 8
};
int state = 0;
for (const auto& c: s) {
InputType inputType = INVALID;
if (isspace(c)) {
inputType = SPACE;
} else if (c == '+' || c == '-') {
inputType = SIGN;
} else if (isdigit(c)) {
inputType = DIGIT;
} else if (c == '.') {
inputType = DOT;
} else if (c == 'e' || c == 'E') {
inputType = EXPONENT;
}
// Get next state from current state and input symbol
state = transitionTable[state][inputType];
// Invalid input
if (state == -1) {
return false;
}
}
// If the current state belongs to one of the accepting (final) states,
// then the number is valid
return state == 1 || state == 4 || state == 7 || state == 8;
}
};
#include <regex>
// It shows runtime error on LintCode Online Judge, but it works with the latest C++14 compiler.
class Solution2 {
public:
/**
* @param s the string that represents a number
* @return whether the string is a valid number
*/
bool isNumber(string& s) {
regex e("^\\s*[\\+-]?((\\d+(\\.\\d*)?)|\\.\\d+)([eE][\\+-]?\\d+)?\\s*$");
return regex_match(s, e);
}
};