LeetCode: 65.Valid Number
题目描述
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.
题目大意: 实现判断给定字符串是否是一个数字的函数
解题思路
根据数字的相关定义, 画出状态转换图, 然后打表或对每个状态写个函数都可以解决。转换图如下:
AC代码
class Solution {
public:
bool Start(const string& s, size_t pos)
{
if(s.empty()) return false;
if(s[pos] == '+' || s[pos] == '-') // +/- number
{
return StatusC(s, pos+1);
}
else if(s[pos] >= '0' && s[pos] <= '9') // number
{
return StatusEndA(s, pos+1);
}
else if(s[pos] == '.') // .number
{
return StatusG(s, pos+1);
}
else
{
return false;
}
}
bool StatusEndA(const string& s, size_t pos)
{
if(pos == s.size()) return true;
if(s[pos] =='.')
{
return StatusEndB(s, pos+1);
}
else if(s[pos] == 'e')
{
return StatusD(s, pos+1);
}
else if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndA(s, pos+1);
}
else
{
return false;
}
}
bool StatusEndB(const string& s, size_t pos)
{
if(pos == s.size()) return true;
if(s[pos] == 'e')
{
return StatusD(s, pos+1);
}
else if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndB(s, pos+1);
}
else
{
return false;
}
}
bool StatusC(const string& s, size_t pos)
{
if(pos == s.size()) return false;
if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndA(s, pos+1);
}
else if(s[pos] == '.')
{
return StatusG(s, pos+1);
}
else
{
return false;
}
}
bool StatusD(const string& s, size_t pos)
{
if(pos == s.size()) return false;
if(s[pos] == '+' || s[pos] == '-')
{
return StatusE(s, pos+1);
}
else if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndF(s, pos+1);
}
else
{
return false;
}
}
bool StatusE(const string& s, size_t pos)
{
if(pos == s.size()) return false;
if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndF(s, pos+1);
}
else
{
return false;
}
}
bool StatusG(const string&s, size_t pos)
{
if(pos == s.size()) return false;
if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndB(s, pos+1);
}
else
{
return false;
}
}
bool StatusEndF(const string& s, size_t pos)
{
if(pos == s.size()) return true;
if(s[pos] >= '0' && s[pos] <= '9')
{
return StatusEndF(s, pos+1);
}
else
{
return false;
}
}
bool isNumber(string s) {
size_t beg = s.find_first_not_of(' ');
size_t end = s.find_last_not_of(' ');
if(beg == s.npos || end == s.npos) return false;
s = s.substr(beg, end-beg+1);
return Start(s, 0);
}
};