剑指 Offer 20. 表示数值的字符串

class Solution {
public:
bool scanUint(string s, int& index) {
int before = index;
while(index < s.size() && s[index] >= '0' && s[index] <= '9') index++;
return index > before;
}
bool scanInt(string s, int& index) {
if(index >= s.size()) return false;
if(s[index] == '+' || s[index] == '-') index++;
return scanUint(s, index);
}
bool isNumber(string s) {
s.erase(0, s.find_first_not_of(' '));
s.erase(s.find_last_not_of(' ') + 1);
if(s == "") return false;
int index = 0;
bool flag = scanInt(s, index);
if(s[index] == '.') flag = scanUint(s, ++index) || flag;
if(s[index] == 'e' || s[index] == 'E') flag = scanInt(s, ++index) && flag;
return flag && index == s.size();
}
};

class Solution {
public:
char charSet[5] = {'e', 'E', '.', '+', '-'};
bool isValid(char ch) {
if(ch >= '0' && ch <= '9') return true;
for(auto cc : charSet) if(ch == cc) return true;
return false;
}
bool isNumber(string s) {
s.erase(0,s.find_first_not_of(" "));
s.erase(s.find_last_not_of(" ") + 1);
string before_e = "", after_e = "";
for(int ii = 0; ii < s.size(); ii++) {
if(!isValid(s[ii])) return false;
if(s[ii] == '.') {
if(ii == 0 && ii < s.size() - 1 && (s[ii + 1] < '0' || s[ii + 1] > '9')) return false;
if(ii && ii == s.size() - 1 && (s[ii - 1] < '0' || s[ii - 1] > '9')) return false;
if(ii > 0 && ii < s.size() - 1
&& (s[ii - 1] < '0' || s[ii - 1] > '9') && (s[ii + 1] < '0' || s[ii + 1] > '9')) return false;
}
if(s[ii] == 'e' || s[ii] == 'E') {
if(ii == s.size() - 1) return false;
before_e = s.substr(0, ii);
after_e = s.substr(ii + 1, s.size() - ii - 1);
}
else if(ii == s.size() - 1 && before_e == "") before_e = s;
}
if(before_e == ""
|| before_e.size() == 1 && (before_e[0] < '0' || before_e[0] > '9')
|| after_e.size() == 1 && (after_e[0] < '0' || after_e[0] > '9')) return false;
bool isExistDot = false;
for(int ii = 0; ii < before_e.size(); ii++) {
if(before_e[ii] == '.') {
if(isExistDot) return false;
isExistDot = true;
}
if(before_e[ii] == 'e' || before_e[ii] == 'E'
|| ii && (before_e[ii] == '+' || before_e[ii] == '-')) return false;
}
for(int ii = 0; ii < after_e.size(); ii++) {
if(after_e[ii] == '.' || ii && after_e[ii] == '-' || ii && after_e[ii] == '+') return false;
}
return true;
}
};