65.valid-number.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. class Solution {
  2. // Numbers 0-9
  3. // Exponent - "e"
  4. // Positive/negative sign - "+"/"-"
  5. // Decimal point - "."
  6. public boolean isNumber(String s) {
  7. // Finite automaton
  8. // State No. | Discription
  9. // ----------+------------
  10. // -1 | Invalid state
  11. // 0 | Initial state
  12. // 1 | Input sign
  13. // 2 | Input digit
  14. // 3 | Input dot
  15. // 4 | Input digit and dot (like .33 or 33. or 3.3)
  16. // 5 | Input exp
  17. // 6 | Input sign after exp
  18. // 7 | Input digit after exp
  19. // 8 | Input space after valid number
  20. // Input state:
  21. // ERROR, SPACE, SIGN, DIGIT, DOT, EXP
  22. // Trans table:
  23. // \input| ERR SPA SGN DIG DOT EXP
  24. // state\ |
  25. // ----------+------------------------
  26. // 0 | -1 0 1 2 3 -1
  27. // 1 | -1 -1 -1 2 3 -1
  28. // 2 | -1 8 -1 2 3 5
  29. // 3 | -1 -1 -1 4 -1 5
  30. // 4 | -1 8 -1 4 -1 5
  31. // 5 | -1 -1 6 7 -1 -1
  32. // 6 | -1 -1 -1 7 -1 -1
  33. // 7 | -1 8 -1 7 -1 -1
  34. // 8 | -1 8 -1 -1 -1 -1
  35. char[] num = s.toCharArray();
  36. int[][] stateTable = new int[][] {
  37. {-1, 0, 1, 2, 3, -1}, // 0
  38. {-1, -1, -1, 2, 3, -1}, // 1
  39. {-1, 8, -1, 2, 4, 5}, // 2
  40. {-1, -1, -1, 4, -1, -1}, // 3
  41. {-1, 8, -1, 4, -1, 5}, // 4
  42. {-1, -1, 6, 7, -1, -1}, // 5
  43. {-1, -1, -1, 7, -1, -1}, // 6
  44. {-1, 8, -1, 7, -1, -1}, // 7
  45. {-1, 8, -1, -1, -1, -1} // 8
  46. };
  47. int state = 0;
  48. for (int i = 0; i < num.length; i++) {
  49. int input = 0; // ERROR
  50. if (num[i] == ' ') input = 1; // SPACE
  51. else if (num[i] == '+' || num[i] == '-') input = 2; // SIGN
  52. else if ('0' <= num[i] && num[i] <= '9') input = 3; // DIGIT
  53. else if (num[i] == '.') input = 4; // DOT
  54. else if (num[i] == 'e' || num[i] == 'E') input = 5; // EXP
  55. state = stateTable[state][input];
  56. if (state == -1) return false;
  57. }
  58. return state == 2 || state == 4 || state == 7 || state == 8;
  59. }
  60. }