Leetcode - 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.

[分析] 体会有限状态机思想的好题,详细分析参考 http://blog.csdn.net/suwei19870312/article/details/12094233
精简的代码真是赏心悦目~

public class Solution {
    private enum InputEnum {
        invalid, space, sign, digit, dot, exponent
    }
    private int[][] transitionTable = {
        {-1, 0, 3, 1, 2, -1}, 
        {-1, 8, -1, 1, 4, 5},
        {-1, -1, -1, 4, -1, -1}, // only accept digits
        {-1, -1, -1, 1, 2, -1}, // similar as state 1, but cann't accept sign & space
        {-1, 8, -1, 4, -1, 5},
        {-1, -1, 6, 7, -1, -1},
        {-1, -1, -1, 7, -1, -1},
        {-1, 8, -1, 7, -1, -1},
        {-1, 8, -1, -1, -1, -1}
    };
    public boolean isNumber(String s) {
        if (s == null || s.length() == 0) return false;
        int state = 0;
        for (int i = 0; i < s.length(); i++) {
            int inputType = InputEnum.invalid.ordinal();
            char curr = s.charAt(i);
            if (curr == ' ')
                inputType = InputEnum.space.ordinal();
            else if (curr == '+' || curr == '-')
                inputType = InputEnum.sign.ordinal();
            else if (curr >= '0' && curr <= '9')
                inputType = InputEnum.digit.ordinal();
            else if (curr == '.')
                inputType = InputEnum.dot.ordinal();
            else if (curr == 'e' || curr == 'E')
                inputType = InputEnum.exponent.ordinal();
            state = transitionTable[state][inputType];
            if (state == -1)
                return false;
        }
        return state == 1 || state == 4 || state == 7 || state == 8;
    }
}

猜你喜欢

转载自likesky3.iteye.com/blog/2221089