思路:
方法:有限状态自动机。时间复杂度O(N),空间复杂度O(N)。
编译原理做过如何判别数字。本题更简单一点,因为测试用例如下是给 true
的:
01 true
.1 true
.0 true
0. true
-1. true
-01 true
-.1 true
-.1e1 true
-.1e-01 true
-1.e-1 true
首先,画出有限自动机状态转移图;
然后,根据图,填表;
最后,根据表,编码实现。
class Solution {
public:
bool isNumber(string s) {
enum InputType {
INVALID, // 1. invalid input
SIGN, // 2. '+' or '-'
DIGIT, // 3. digits
DOT, // 4. '.'
EXP // 5. 'e'
};
const int NUM_INPUT = 5;
if(s == " ") return false;
//get rid of space
int start = s.find_first_not_of(" ");
int end = s.find_last_not_of(" ");
string ss = s.substr(start, end-start+1);
int n = ss.size();
int state = 0;
const int transitionTable[][NUM_INPUT] = {
-1, 3, 1, 2, -1,
-1, -1, 1, 4, 5,
-1, -1, 4, -1, -1,
-1, -1, 1, 2, -1,
-1, -1, 4, -1, 5,
-1, 6, 7, -1, -1,
-1, -1, 7, -1, -1,
-1, -1, 7, -1, -1,
-1, -1, 7, -1, -1,
};
for(int i = 0; i < n; ++i) {
InputType type = INVALID;
if(ss[i] == '+' || ss[i] == '-') {
type = SIGN;
}else if(isdigit(ss[i])) {
type = DIGIT;
}else if(ss[i] == '.') {
type = DOT;
}else if(ss[i] == 'e' || ss[i] == 'E') {
type = EXP;
}
state = transitionTable[state][type];
if(state == -1) return false;
}
return state == 1 || state == 4 || state == 7;
}
};