//20210508
写在前面:今天刷leetcode刷到的题目,一开始用暴力写逻辑,漏洞百出,遂放弃,去看题解,发现使用自动机做(编译原理知识),实现之后觉得挺有意思(确实也是我不会的东西),所以在这里记录一下
将系统中可能出现的状态列出来,并把从一个状态到另一个状态是否能够转移标记出来,最后生成一个二维状态数组,循环的时候使用数组状态转移,在状态为-1的时候返回false,如果循环之后没有返回,则判断最后的状态是否为状态图中可以为终态的状态结点,如果是,则返回true,否则返回false
图解如下(比较潦草,看不懂可留言~):
二维数组如下:
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")); } }