• leetcode 65题——有效数字_自动机解_java实现


    leetcode 65题——有效数字_自动机解_java实现

    //20210508
    写在前面:今天刷leetcode刷到的题目,一开始用暴力写逻辑,漏洞百出,遂放弃,去看题解,发现使用自动机做(编译原理知识),实现之后觉得挺有意思(确实也是我不会的东西),所以在这里记录一下

    自动机逻辑:

    • 将系统中可能出现的状态列出来,并把从一个状态到另一个状态是否能够转移标记出来,最后生成一个二维状态数组,循环的时候使用数组状态转移,在状态为-1的时候返回false,如果循环之后没有返回,则判断最后的状态是否为状态图中可以为终态的状态结点,如果是,则返回true,否则返回false

    • 图解如下(比较潦草,看不懂可留言~):

    • 二维数组如下:

    题目描述

    • image

    程序源代码

    package algorithm;
    
    public class IsNumber {
        public static int make(char s){
            switch (s){
                case ' ':return 0;
                case '+':
                case '-':return 1;
                case '.':return 3;
                case 'E':
                case 'e':return 4;
                default:
                    if(s>='0'&&s<='9')return 2;
            }
            return -1;//其他情况
        }
    
        //自动机
        public static boolean isNumber(String s) {
            char[] sArr = s.toCharArray();
            int[][] global_state = {
                    {0,1,6,2,-1,-1},
                    {-1,-1,6,2,-1,-1},
                    {-1,-1,3,-1,-1,-1},
                    {8,-1,3,-1,4,-1},
                    {-1,7,5,-1,-1,-1},
                    {8,-1,5,-1,-1,-1},
                    {8,-1,6,3,4,-1},
                    {-1,-1,5,-1,-1,-1},
                    {8,-1,-1,-1,-1,-1}
            };
            int state = 0;
            for(int i = 0;i<sArr.length;++i){
                int temp = make(sArr[i]);
                if(temp==-1)return false;
                state = global_state[state][temp];
                if(state==-1) return false;
            }
            if(state==8||state==6||state==3||state==5) return true;
            return false;
        }
    
        public static void main(String[] args) {
            System.out.println(isNumber("0"));
        }
    }
    
    

    leetcode通过截图

  • 相关阅读:
    七. 多线程编程3.主线程
    七. 多线程编程1.线程的概念
    六. 异常处理12.断言
    liunx 安装 mysql 5.6
    idea Unable to open debugger port (127.0.0.1:58006) Address already in use: JVM_Bind 的解决办法
    liunx 安装redis 4.0
    liunx 安装jdk1.8
    idea 去除xml文件sql语句背景色
    改变数据库和表编码
    mybatis 按in 函数参数顺序排序
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14746802.html
Copyright © 2020-2023  润新知