其他分享
首页 > 其他分享> > 2021-06-17题解

2021-06-17题解

作者:互联网

文章目录2021/6/17


一、LeetCode每日一题

题目链接

有效数字

题解

观察数据范围 1 < = s . l e n g t h < = 20 1 <= s.length <= 20 1<=s.length<=20,提示我们可以设计最坏 O ( 2 n ) O(2^n) O(2n)的算法。

解法一暴力匹配

按照题目中所给出的条件模拟匹配即可。坏处,逻辑复杂易出错。

解法二DFA(确定有限状态自动机)

D F A DFA DFA简介:

题解

当前状态空格(下标为0)符号(+/-)(下标为1)数字(0,9)(下标为2)小数点(.) (下标为3)指数符号(e/E)(下标为4)其他
00(初始状态)1(符号位)6(普通数字)2(小数点)-1-1
当前状态空格符号(+/-)数字(0,9)小数点(.)指数符号(e/E)其他
4-17(指数符号后的符号位)5(指数符号后的数字)-1-1-1
当前状态空格符号(+/-)数字(0,9)小数点(.)指数符号(e/E)其他
00162-1-1
1-1-162-1-1
2-1-13-1-1-1
38-13-14-1
4-175-1-1-1
58-15-1-1-1
68-1634-1
7-1-15-1-1-1
88-1-1-1-1-1

代码

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

int getType(char c) {
    switch (c) {
        case ' ': return 0;
        case '+':
        case '-': return 1;
        case '.': return 3;
        case 'e':
        case 'E': return 4;
        default:
            if (c >= '0' && c <= '9') return 2;
            return -1;
    }
}

bool isNumber(string s) {
    int curState = 0;
    for (char c : s) {
        int type = getType(c);
        if (type == -1) return false;
        curState = DFA[curState][type];
        if (curState == -1) return false;
    }
    // 3 5 6代表上边说的那三种合法的结束状态
    return curState == 3 || curState == 6 || curState == 5;
}

时空复杂度分析

标签:状态,06,数字,符号,题解,小数点,2021,return,DFA
来源: https://blog.csdn.net/bullkill8HIT/article/details/117998448