leetcode 65 Valid Number

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;
    }
};
原文地址:https://www.cnblogs.com/LiuQiujie/p/12696689.html