验证数字是否是合法的,考虑使用编译原理中的DFA图来做的,分别赋予不同的状态以及在状态之间的转化过程的。
class Solution { public: bool isNumber(string s) { int i=0; int n=s.size(); while(i<n&&s[i]==' ') i++; while(n-1>=0&&s[n-1]==' ')n--; //cout<<i<<" "<<n<<endl; int state=1; for(;i<n;i++){ if(state==1){ if(s[i]=='-'||s[i]=='+') state=2; else if(s[i]=='.') state=4; else if(s[i]>='0'&&s[i]<='9') state=3; else return false; } else if(state==2){ if(s[i]>='0'&&s[i]<='9') state=3; else if(s[i]=='.') state=4; else return false; } else if(state==3){ if(s[i]>='0'&&s[i]<='9') state=3; else if(s[i]=='.') state=5; else if(s[i]=='e'||s[i]=='E') state=6; // 别漏了这个状态的 else return false; } else if(state==4){ if(s[i]>='0'&&s[i]<='9') state=5; else return false; } else if(state==5){ if(s[i]>='0'&&s[i]<='9') state=5; else if(s[i]=='e'||s[i]=='E') state=6; else return false; } else if(state==6){ if(s[i]>='0'&&s[i]<='9') state=8; else if(s[i]=='-'||s[i]=='+') state=7; else return false; } else if(state==7){ if(s[i]>='0'&&s[i]<='9') state=8; else return false; } else if(state==8){ if(s[i]>='0'&&s[i]<='9') state=8; else return false; } else return false; } return (state==3||state==5||state==8); } };