一、
原网址为https://leetcode.com/problems/valid-number/description/
二、题目
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.
三、我的solutionclass Solution {
public:
bool isNumber(string s) {
s = trim(s);
if (s.empty()) return false;
s += '$';
int state = 0;
int prestate;
char c;
int p = 0;
while (1) {
switch (state) {
case 0:
c = s[p++];
if (isDigit(c)) state = 1;
else if (c == '.') {
prestate = 0;
state = 2;
}
else if (c == '+' || c == '-'){
state = 9;
}
else state = 8;
break;
case 1:
c = s[p++];
if (isDigit(c)) state = 1;
else if (c == '.') {
prestate = 1;
state = 2;
}
else if (c == 'E' || c == 'e') state = 4;
else state = 7;
break;
case 2:
c = s[p++];
if (isDigit(c)) state = 3;
else if (prestate == 0) state = 8;
else if (c == 'E' || c == 'e') state = 4;
else state = 7;
break;
case 3:
c = s[p++];
if (isDigit(c)) state = 3;
else if (c == 'E' || c == 'e') state = 4;
else state = 7;
break;
case 4:
c = s[p++];
if (isDigit(c)) state = 6;
else if (c == '+' || c == '-') state = 5;
else state = 8;
break;
case 5:
c = s[p++];
if (isDigit(c)) state = 6;
else state = 8;
break;
case 6:
c = s[p++];
if (isDigit(c)) state = 6;
else state = 7;
break;
case 7:
if (p != s.size()) return false;
return true;
break;
case 8:
return false;
break;
case 9:
c = s[p++];
if (isDigit(c)) state = 1;
else if (c == '.') {
prestate = 0;
state = 2;
}
else state = 8;
break;
}
}
return true;
}
bool isDigit(char c) {
if (c >= '0' && c <= '9') return true;
return false;
}
string& trim(std::string& s) {
if (s.empty()) {
return s;
}
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
return s;
}
};
以上实现了一个数字的有穷确定自动机