请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"都表示数值,
但"12e"、"1a3.14"、"1.2.3"、"+-5"、"-1E-16"及"12e+5.4"都不是。
之前都不知道有限状态自动机=。=
看着大佬的思路,自己尝试了一下
尽管状态划分得有点多,没有大佬的简洁,但是毕竟是根据自己理解写的,记录一下
class Solution {
public boolean isNumber(String s) {
Map[] states = new Map[10];
states[0] = new HashMap(){{put('d',1);put('f',2);put(' ',0);put('.',8);}};
states[1] = new HashMap(){{put('d',1);put('.',3);put('e',4);put(' ',6);}};
states[2] = new HashMap(){{put('.',8);put('d',1);}};
states[3] = new HashMap(){{put('e',4);put('d',5);put(' ',6);}};
states[4] = new HashMap(){{put('f',7);put('d',9);}};
states[5] = new HashMap(){{put('d',5);put(' ',6);put('e',4);}};
states[6] = new HashMap(){{put(' ',6);}};
states[7] = new HashMap(){{put('d',9);}};
states[8] = new HashMap(){{put('d',5);}};
states[9] = new HashMap(){{put('d',9);put(' ',6);}};
int start = 0;
char cmp;
for(char c : s.toCharArray()){
if(c=='+'||c=='-')cmp='f';
else if(c>='0'&&c<='9')cmp='d';
else cmp=c;
if(!states[start].containsKey(cmp)) return false;
start = (int)states[start].get(cmp);
}
return start==1||start==3||start==5||start==6||start==9;
}
}
