题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题思路
有限状态自动机。正好复习下有限状态自动机的方法。DFA的基本方法是使用一个while
死循环,作为底层驱动,然后有个状态标记再各个状态之间进行变换。这类题目的难点往往在于如何正确的划分各个状态。下面给出本题目的状态图:
核心的思想在于,区分了各种类型数据和符号的状态
AC代码
class Solution {
public:
enum STATE { START, INT, SIGNED1, POINT, EXP, FLOAT, SCIENCE, SIGNED2 };
bool isNumeric(char* str)
{
if (str == nullptr) {
return false;
}
STATE state = STATE::START;
int i = 0;
while (true) {
switch (state)
{
case STATE::START:
if (str[i] == '+' || str[i] == '-') {
state = STATE::SIGNED1;
}
else if (isdigit(str[i])) {
state = STATE::INT;
}
else if (str[i] == '.') {
state = STATE::POINT;
}
else {
return false;
}
break;
case STATE::SIGNED1:
if (str[i] == '.') {
state = STATE::POINT;
}
else if (isdigit(str[i])) {
state = STATE::INT;
}
else {
return false;
}
break;
case STATE::POINT:
if (isdigit(str[i])) {
state = STATE::FLOAT;
}
else {
return false;
}
break;
case STATE::INT:
if (isdigit(str[i])) {
state = STATE::INT;
}
else if (str[i] == '\0') { // 结束状态
return true;
}
else if (str[i] == '.') {
state = STATE::FLOAT;
}
else if (str[i] == 'E' || str[i] == 'e') {
state = STATE::EXP;
}
else {
return false;
}
break;
case STATE::FLOAT:
if (isdigit(str[i])) {
state = STATE::FLOAT;
}
else if (str[i] == 'e' || str[i] == 'E') {
state = STATE::EXP;
}
else if (str[i] == '\0') {
return true;
}
else {
return false;
}
break;
case STATE::EXP:
if (str[i] == '+' || str[i] == '-') {
state = STATE::SIGNED2;
}
else if (isdigit(str[i])) {
state = STATE::SCIENCE;
}
else {
return false;
}
break;
case STATE::SCIENCE:
if (isdigit(str[i])) {
state = STATE::SCIENCE;
}
else if (str[i] == '\0') {
return true;
}
else {
return false;
}
break;
case STATE::SIGNED2:
if (isdigit(str[i])) {
state = STATE::SCIENCE;
}
else {
return false;
}
break;
default:
return false;
}
++i; // 移动指针
}
}
};