剑指 Offer 20. 表示数值的字符串

有限状态自动机 HashMap求解

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

数值(按顺序)可以分成以下几个部分:

    1.若干空格
    2.一个 小数 或者 整数
    3.(可选)一个 'e' 或 'E' ,后面跟着一个 整数
    4.若干空格

小数(按顺序)可以分成以下几个部分:

    1.(可选)一个符号字符('+' 或 '-')
    下述格式之一:
        1.至少一位数字,后面跟着一个点 '.'
        2.至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
        3.一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

    1.(可选)一个符号字符('+' 或 '-')
    2.至少一位数字

注:

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

本题难点:自动机的状态转换图比较难画 HashMap数组的操作不熟悉

1.首先根据题目描述来画出状态转换图

2. 利用HashMap数组对每个状态单独put键值对,如Map[0].put('d',2)代表在0状态下,输入数字就转到2状态。//这里用n代表数字,s代表符号

Map[] status = {
            new HashMap<>(){{put(' ',0);put('s',1);put('n',2);put('.',4);}},
            new HashMap<>(){{put('n',2);put('.',4);}},
            new HashMap<>(){{put('n',2);put('e',5);put('.',3);put(' ',8);}},
            new HashMap<>(){{put('n',3);put('e',5);put(' ',8);}},
            new HashMap<>(){{put('n',3);}},
            new HashMap<>(){{put('s',6);put('n',7);}},
            new HashMap<>(){{put('n',7);}},
            new HashMap<>(){{put('n',7);put(' ',8);}},
            new HashMap<>(){{put(' ',8);}}
        };

3.对输入的符号串逐位判断,不断更新现在所在的状态,若最后状态为接受状态,返回true

        int p = 0;
        char t;
        for(char c : s.toCharArray()){
            if(c == '+'||c == '-') t = 's';
            else if(c >='0'&&c<='9') t = 'n';
            else if(c =='e'||c=='E') t ='e';
            else if(c == '.'||c ==' ') t = c;
            else t = 'x';
            if(status[p].containsKey(t) == false) return false;
            p = (int)status[p].get(t);
        }
        if(p==2||p==3||p==7||p==8)
            return true;
        return false;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值