123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- class Solution {
- // Numbers 0-9
- // Exponent - "e"
- // Positive/negative sign - "+"/"-"
- // Decimal point - "."
- public boolean isNumber(String s) {
- // Finite automaton
- // State No. | Discription
- // ----------+------------
- // -1 | Invalid state
- // 0 | Initial state
- // 1 | Input sign
- // 2 | Input digit
- // 3 | Input dot
- // 4 | Input digit and dot (like .33 or 33. or 3.3)
- // 5 | Input exp
- // 6 | Input sign after exp
- // 7 | Input digit after exp
- // 8 | Input space after valid number
- // Input state:
- // ERROR, SPACE, SIGN, DIGIT, DOT, EXP
- // Trans table:
- // \input| ERR SPA SGN DIG DOT EXP
- // state\ |
- // ----------+------------------------
- // 0 | -1 0 1 2 3 -1
- // 1 | -1 -1 -1 2 3 -1
- // 2 | -1 8 -1 2 3 5
- // 3 | -1 -1 -1 4 -1 5
- // 4 | -1 8 -1 4 -1 5
- // 5 | -1 -1 6 7 -1 -1
- // 6 | -1 -1 -1 7 -1 -1
- // 7 | -1 8 -1 7 -1 -1
- // 8 | -1 8 -1 -1 -1 -1
- char[] num = s.toCharArray();
- int[][] stateTable = new int[][] {
- {-1, 0, 1, 2, 3, -1}, // 0
- {-1, -1, -1, 2, 3, -1}, // 1
- {-1, 8, -1, 2, 4, 5}, // 2
- {-1, -1, -1, 4, -1, -1}, // 3
- {-1, 8, -1, 4, -1, 5}, // 4
- {-1, -1, 6, 7, -1, -1}, // 5
- {-1, -1, -1, 7, -1, -1}, // 6
- {-1, 8, -1, 7, -1, -1}, // 7
- {-1, 8, -1, -1, -1, -1} // 8
- };
- int state = 0;
- for (int i = 0; i < num.length; i++) {
- int input = 0; // ERROR
- if (num[i] == ' ') input = 1; // SPACE
- else if (num[i] == '+' || num[i] == '-') input = 2; // SIGN
- else if ('0' <= num[i] && num[i] <= '9') input = 3; // DIGIT
- else if (num[i] == '.') input = 4; // DOT
- else if (num[i] == 'e' || num[i] == 'E') input = 5; // EXP
- state = stateTable[state][input];
- if (state == -1) return false;
- }
- return state == 2 || state == 4 || state == 7 || state == 8;
- }
- }
|