美文网首页
剑指 Offer 第20题:表示数值的字符串

剑指 Offer 第20题:表示数值的字符串

作者: 放开那个BUG | 来源:发表于2022-07-11 17:20 被阅读0次

1、前言

题目描述

2、思路

使用 DFA,定义9个状态。

状态图
状态转换图

3、代码

class Solution {
    public boolean isNumber(String s) {
        if(s == null || s.length() == 0){
            return false;
        }

        int[][] transTable = {
                {1,2,7,-1,-1,0},
                {-1,2,7,-1,-1,-1},
                {-1,2,3,4,-1,9},
                {-1,3,-1,4,-1,9},
                {6,5,-1,-1,-1,-1},
                {-1,5,-1,-1,-1,9},
                {-1,5,-1,-1,-1,-1},
                {-1,8,-1,-1,-1,-1},
                {-1,8,-1,4,-1,9},
                {-1,-1,-1,-1,-1,9}
        };

        Map<String, Integer> cols = new HashMap<>();
        cols.put("sign", 0);
        cols.put("number", 1);
        cols.put(".", 2);
        cols.put("exp", 3);
        cols.put("other", 4);
        cols.put("blank", 5);

        List<Integer> legalState = new ArrayList<>();
        legalState.add(2);
        legalState.add(3);
        legalState.add(5);
        legalState.add(8);
        legalState.add(9);

        int state = 0;
        for (char c : s.toCharArray()) {
            state = transTable[state][cols.get(this.getCol(c))];
            if(state == -1)
                return false;
        }
        
        return legalState.contains(state);
    }


    public String getCol(char c){
        if (c == '+'|| c == '-') return "sign";
        if (c >= '0'&& c <= '9') return "number";
        if (c == '.') return ".";
        if (c == 'E'||c == 'e') return "exp";
        if (c ==' ') return "blank";
        return "other";
    }
}

相关文章

网友评论

      本文标题:剑指 Offer 第20题:表示数值的字符串

      本文链接:https://www.haomeiwen.com/subject/onmrurtx.html