[[EVD]] - 剑指 Offer 20. 表示数值的字符串

题目分析:[[EVD]] - 剑指 Offer 20. 表示数值的字符串icon-default.png?t=M276https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

简单描述:

  • 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

限制🚫

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

示例:

输入:s = "0"
输出:true

输入:s = "    .1  "
输出:true

解题思路:

思路:

  • #有限状态自动机DFA  A = (输入表,状态集S,初始态S0,状态转移函数Q,接受态F) = A(5种符号,9个状态,初始状态0,p=status[p][输入],接受状态:2、3、7、8) **PS:也可以考虑官方题解的,独立出小数部分这个状态**
  • 状态转移表
  • 借用大佬图片,如有侵权请联系我删除

效率:

  • 时间复杂度O(n)
  • 空间复杂度O(1)

代码:

class Solution
{
public:
    /*DFA*/
    typedef pair<char, int> charint;
    typedef unordered_map<char, int> unmap;
    bool isNumber(string s)
    {
        vector<unmap> status = {
            // 0 首次输入
            unmap{charint(' ', 0), charint('s', 1), charint('d', 2), charint('.', 4)},
            // 1
            unmap{charint('d', 2), charint('.', 4)},
            // 2
            unmap{charint('d', 2), charint('.', 3), charint('e', 5), charint(' ', 8)},
            // 3
            unmap{charint('d', 3), charint('e', 5), charint(' ', 8)},
            // 4
            unmap{charint('d', 3)},
            // 5
            unmap{charint('d', 7), charint('s', 6)},
            // 6
            unmap{charint('d', 7)},
            // 7
            unmap{charint('d', 7), charint(' ', 8)},
            // 8
            unmap{charint(' ', 8)}};
        int p = 0;
        char t;
        for (auto c : s)
        {
            if (c >= '0' && c <= '9')
                t = 'd';
            else if (c == '+' || c == '-')
                t = 's';
            else if (c == 'e' || c == 'E')
                t = 'e';
            else if (c == ' ' || c == '.')
                t = c;
            else
                t = '?';
            if (!status[p].count(t))
                return false;
            p = (int)status[p][t];
        }
        return p == 2 || p == 3 || p == 7 || p == 8;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值