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; } };