class Solution {
public:
bool isNumber(string s) {
if(s.empty()) return true;
unordered_set<char> chars,nums;
for(int i=0;i<26;++i) {chars.insert('a'+i);chars.insert('A'+i);}
chars.erase('e');
for(int i=0;i<10;++i) nums.insert('0'+i);
while(!s.empty()&&s[0]==' ') s.erase(s.begin());
if(s.empty()) return false;
while(s.back()==' ') s.pop_back();
vector<int> vec;
for(int i=0;i<s.size();++i) {
char ch=s[i];
if(chars.find(ch)!=chars.end()||ch==' ') return false;
if(nums.find(ch)!=nums.end()) {
if(i!=0&&vec[i-1]==1) {s.erase(i,1);--i;}
else vec.push_back(1);
continue;
}
if(ch=='.'||ch=='e') {vec.push_back(-1);}
if(ch=='+'||ch=='-') {
if(i!=0&&s[i-1]=='e') {s.erase(i,1);--i;}
else vec.push_back(-1);
}
}
bool eflag=false;
for(int i=0;i<s.size();++i) {
if(vec[i]==1) continue;
char ch=s[i];
switch(ch) {
case '.':
if(i<s.size()-2&s[i+2]=='.') return false;
if(!i) {
if(i==s.size()-1) return false;
if(vec[i+1]<0) {return false;}
continue;
}
if(i==s.size()-1) {
if(vec[i-1]<0) return false;
continue;
}
if(vec[i-1]<0||vec[i+1]<0) {
if(s[i-1]=='+'||s[i-1]=='-'||s[i+1]=='e') continue;
return false;
}
break;
case 'e':
if(eflag) return false;
if(!i||i==s.size()-1) return false;
if(i<s.size()-2) {
if((s[i+1]=='+'||s[i+1]=='-')&&vec[i+2]) {++i;continue;}
if(vec[i+1]>0&&vec[i+2]<0) return false;
}
if(i==s.size()-2&&vec[i+1]<0) return false;
eflag=true;
break;
case '+':
case '-':
if(i!=0) return false;
if(i==s.size()-1) return false;
if(s[i+1]=='e') return false;
}
}
return true;
}
};