Valid Number

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

思路:用有效自动机来标记每一种状态,在画自动机时要将每种状态严格区分开来,并作好记录。

  1. bool isNumber(const char *s) {
  2. int size = strlen(s);
  3. if(size == 0) return false;
  4. enum input{INVALID,SPACE,SIGN,DOT,DIGIT,EXP,NUMBER};
  5. int state[][NUMBER] = {
  6. -1,0,1,2,3,-1, // 0,empty { space,sign,dot,digit}
  7. -1,-1,-1,2,3,-1, // 1,sign { dot,digit}
  8. -1,-1,-1,-1,4,-1, //2,dot / e+/d {digit}
  9. -1,8,-1,4,3,5, // 3,digit; {digit,space,dot,exp}
  10. -1,8,-1,-1,4,5, // 4,dot+digit { digit,space,exp}
  11. -1,-1,7,-1,6,-1, // 5,(digit+dot)e/E + S {sign,digit}
  12. -1,8,-1,-1,6,-1, // 6, {digit,space}
  13. -1,-1,-1,-1,6,-1,// 7. (digit + dot)e/E + d { digit}
  14. -1,8,-1,-1,-1,-1 // space {space}
  15. };
  16. int state_number = 0;
  17. while(*s!='\0') {
  18. char cur = *s;
  19. if(cur == ' ') {
  20. state_number = state[state_number][SPACE];
  21. }else if(cur == '+' || cur=='-') {
  22. state_number = state[state_number][SIGN];
  23. } else if(cur=='.') {
  24. state_number = state[state_number][DOT];
  25. } else if(cur == 'e' ||cur == 'E') {
  26. state_number = state[state_number][EXP];
  27. } else if(isdigit(cur)) {
  28. state_number = state[state_number][DIGIT];
  29. } else {
  30. return false;
  31. }
  32. if(state_number == -1) return false;
  33. s++;
  34. }
  35. return state_number == 6 || state_number == 8 || state_number==3 || state_number == 4;
  36. }
posted @ 2014-10-05 10:36  purejade  阅读(109)  评论(0)    收藏  举报