有限状态自动机 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;