LeetCode - Valid Number | Darren's Blog



Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
public boolean isNumber(String s) {
        s = s.trim();       // Get rid of leading and trailing whitespaces
        int n = s.length();
        if (n == 0)
            return false;
        boolean isFractional = false;   // Indicate appearance of '.'
        boolean isExponential = false;  // Indicate appearance of 'e/E'
        boolean valid = false;          // Indicate whether preceding digits are valid
        boolean expoBefore = false;     // Indicate whether the preceding digit is 'e/E'
        boolean validFrac = true;       // Indicate whether the number is a vaild fraction (true by default)
        boolean validExpo = true;       // Indicate whether the number is a valid exponential (true by default)
        int i = 0;
        if (s.charAt(0) == '+' || s.charAt(0) == '-')   // Consider sign
            i = 1;
        // Process each digit in sequence
        for (; i < n; i++) {
            char c = s.charAt(i);
            if (c == '+' || c == '-') {     // +/- is valid only after e/E
                if (!expoBefore)
                    return false;
                expoBefore = false;
                valid = false;
            } else if (c == 'e' || c == 'E') {  // Only one e/E is valid; preceding digits should be valid
                if (isExponential || !valid)
                    return false;
                isExponential = true;
                valid = false;
                expoBefore = true;
                validExpo = false;
            } else if (c == '.') {  // Only one '.' is valid; cannot appear as an exponential
                if (isFractional || isExponential)
                    return false;
                isFractional = true;
                if (!valid)     // Must have fractional part
                    validFrac = false;
            } else if (c >= '0' && c <='9') {   // Regular digits
                valid = true;
                expoBefore = false;
                validFrac = true;
                validExpo = true;
            } else {
                return false;
            }
        }
        // After reaching the end, make sure the number is indeed valid
        if (!valid || !validFrac || !validExpo)
            return false;
        else
            return true;
    }

Use DFA(Deterministic Finite Automata)
Code from http://jelices.blogspot.com/2013/12/leetcode-valid-number.html
We accept the following regular grammar, shown as UNIX regular expression by simplicity:
\s*[\+\-]?(([0-9]+(\.[0-9]*)?)|\.[0-9]+)([eE][+-]?[0-9]+)?\s*
where \s represents [ \t].

This regular expression is accepted by the underneath DFA(Deterministic Finite Automata):
public boolean isNumber(String s) 
    {
        int state = 0;
        for(int i=0; i<s.length();i++)
        {
            state=getNextState(state, s.charAt(i));
            if (state==-1)
                return false;
        }
        state = getNextState(state, ' ');
        return state == 8;
    }
    
    private int getNextState(int state, char c)
    {
        int[][] transitionTable = { {0,2,1,3,-1,-1},
                                    {-1,2,-1,3,-1,-1},
                                    {8,2,-1,4,5,-1},
                                    {-1,4,-1,-1,-1,-1},
                                    {8,4,-1,-1,5,-1},
                                    {-1,7,6,-1,-1,-1},
                                    {-1,7,-1,-1,-1,-1},
                                    {8,7,-1,-1,-1,-1},
                                    {8,-1,-1,-1,-1,-1}};
        return transitionTable[state][getSymbol(c)];
    }
    
    private int getSymbol(char c)
    {
        switch(c)
        {
            case ' ': case '\t': return 0;
            case '0': case '1': case '2':case '3': case '4': case '5': case '6': case '7': case '8': case '9': return 1;
            case '+': case '-': return 2;
            case '.': return 3;
            case 'E': case 'e': return 4;
            default: return 5;
        }
    }
Use Regular Expression:
Code from http://www.cnblogs.com/midnightcat/p/3364431.html
Pattern p = Pattern.compile("^[\\+\\-]?((\\d+(\\.\\d*)?)|(\\.\\d+))(e[\\+\\-]?\\d+)?$");
    public boolean isNumber(String s) {
        String ss = s.trim();
        return p.matcher(ss).matches();
    }
Also refer to http://blog.csdn.net/ithomer/article/details/8832300
Read full article from LeetCode - Valid Number | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts