https://leetcode-cn.com/problems/valid-number/
思路:看官方题解吧,写的挺好的(其实是我自己也不会DFA orz)。
class Solution {
public:
enum State {
STATE_INITIAL,
STATE_INT_SIGN,
STATE_INTEGER,
STATE_POINT,
STATE_POINT_WITHOUT_INT,
STATE_FRACTION,
STATE_EXP,
STATE_EXP_SIGN,
STATE_EXP_NUMBER
};
enum CharType {
CHAR_NUMBER,
CHAR_EXP,
CHAR_POINT,
CHAR_SIGN,
CHAR_ILLEGAL
};
CharType toCharType(char ch) {
if (ch >= '0' && ch <= '9') {
return CHAR_NUMBER;
} else if (ch == 'e' || ch == 'E') {
return CHAR_EXP;
} else if (ch == '.') {
return CHAR_POINT;
} else if (ch == '+' || ch == '-') {
return CHAR_SIGN;
} else {
return CHAR_ILLEGAL;
}
}
bool isNumber(string s) {
unordered_map<State,unordered_map<CharType,State>> t={
{
STATE_INITIAL,{
{CHAR_NUMBER,STATE_INTEGER},
{CHAR_POINT,STATE_POINT_WITHOUT_INT},
{CHAR_SIGN,STATE_INT_SIGN}
}
},
{
STATE_INT_SIGN,{
{CHAR_NUMBER,STATE_INTEGER},
{CHAR_POINT,STATE_POINT_WITHOUT_INT},
}
},
{
STATE_INTEGER,{
{CHAR_NUMBER,STATE_INTEGER},
{CHAR_EXP,STATE_EXP},
{CHAR_POINT,STATE_POINT},
}
},
{
STATE_POINT,{
{CHAR_NUMBER,STATE_FRACTION},
{CHAR_EXP,STATE_EXP}
}
},
{
STATE_POINT_WITHOUT_INT,{
{CHAR_NUMBER,STATE_FRACTION}
}
},
{
STATE_FRACTION,{
{CHAR_NUMBER,STATE_FRACTION},
{CHAR_EXP,STATE_EXP}
}
},
{
STATE_EXP,{
{CHAR_NUMBER,STATE_EXP_NUMBER},
{CHAR_SIGN,STATE_EXP_SIGN}
}
},
{
STATE_EXP_SIGN,{
{CHAR_NUMBER,STATE_EXP_NUMBER}
}
},
{
STATE_EXP_NUMBER,{
{CHAR_NUMBER,STATE_EXP_NUMBER}
}
}
};
State curState=STATE_INITIAL;
for(auto &ch:s)
{
CharType type=toCharType(ch);
auto it=t.find(curState)->second;
if(it.find(type)==it.end())
return false;
curState=it[type];
}
return curState==STATE_INTEGER||curState==STATE_POINT||curState==STATE_FRACTION||curState==STATE_EXP_NUMBER;
}
};