zoukankan      html  css  js  c++  java
  • 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通过截图

  • 相关阅读:
    数据结构(java语言描述)顺序栈的使用(两个大数相加)
    DB2 Sql性能查看与优化
    spring默认为单例模式
    Java map的匿名类的初始化
    使用nohup后台执行ftp传输命令
    停止一个java的线程执行
    静态类
    XML语法随记
    Crontab有关
    string转Date转回String(JAVA)
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14746802.html
Copyright © 2011-2022 走看看