-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0065.valid_number_H.c
93 lines (89 loc) · 1.71 KB
/
0065.valid_number_H.c
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
83
84
85
86
87
88
89
90
91
92
93
/**
* https://leetcode.com/problems/valid-number/description/
* 2015/07
* 8 ms
*/
/*
* DFA for (+|-|e)( )*num*(.|e)num*
* state 4 is dead
*/
static const int DFA[5][4] = \
{
{1, 3, 2, 4},
{4, 3, 2, 4},
{4, 3, 2, 4},
{4, 4, 3, 4},
{4, 4, 4, 4}
};
bool isReal(char * s, int len)
{
if(len <= 0)
return false;
int idx;
for(idx = 0; idx < len; idx ++)
if(s[idx] >= '0' && s[idx] <= '9')
break;
if(idx >= len)
return false; // no digit in s
idx = 0;
int state = 0;
int move;
while(idx < len)
{
if(s[idx] == '+' || s[idx] == '-')
move = 0;
else if(s[idx] == '.')
move = 1;
else if(s[idx] >= '0' && s[idx] <= '9')
move = 2;
else
move = 3;
state = DFA[state][move];
if(state == 4)
return false;
idx ++;
}
if(state == 4)
return false;
return true;
}
bool isInt(char * s, int len)
{
if(len <= 0)
return false;
if(* s == '+' || * s == '-')
{
s ++;
len --;
}
if(len <= 0)
return false;
int idx;
for(idx = 0; idx < len; idx ++)
{
if(s[idx] < '0' || s[idx] > '9')
return false;
}
return true;
}
bool isNumber(char * s)
{
int len = strlen(s);
while(* s == ' ')
{
s ++;
len --;
}
while(s[len - 1] == ' ')
len --;
// trim spaces
int idx;
for(idx = 0; idx < len; idx ++)
if(s[idx] == 'e' || s[idx] == 'E')
break;
// find 'E' or 'e'
if(idx < len)
return isReal(s, idx) && isInt(s + idx + 1, len - idx - 1);
else
return isReal(s, len);
}