1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public boolean isNumber(String s) { boolean seenDigit = false; boolean seenDot = false; boolean seenExp = false; char[] sArray = s.toCharArray(); for (int i = 0; i < sArray.length; i++) { if (Character.isDigit(sArray[i])) { seenDigit = true; } else if (sArray[i] == '+' || sArray[i] == '-') { if (i > 0 && sArray[i - 1] != 'e' && sArray[i - 1] != 'E') { return false; } } else if (sArray[i] == '.') { if (seenDot || seenExp) { return false; } seenDot = true; } else if (sArray[i] == 'e' || sArray[i] == 'E') { if (seenExp || !seenDigit) { return false; } seenExp = true; seenDigit = false; } else { return false; } } return seenDigit; } }
|
一共有四种: digit, dot, sign和exp.
sign只能在开头以及e的后面出现.
dot只能在前面没有dot并且前面没有e的位置出现. dot后可以没有digit.
digit可以在任意位置出现.
exp只能在之前没有exp出现而且之前必须有digit. e后面也需要有digit.
时间复杂度: O(n)
空间复杂度: O(1)
DFA每个node就是一个状态, 从当前状态可以到别的状态. 根据题意, 当下是digit的时候, 下一个可以是digit, dot, exp都可以,
但是不能是sign, 因此发散出三条线去到三个不同的其他状态. 当前是dot, 下一个只能是digit. 这样我们就知道发散出去的线路有哪些.
至于状态, 就是看上面的那三个boolean的组合有哪些.
时间复杂度和空间复杂度不变.