剑指 Offer 20. 表示数值的字符串
图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5dkal2/
使用状态机
public class Solution {
public boolean isNumber(String s) {
// 定义状态机
Map[] maps = {
new HashMap<Character, Integer>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, // 状态 0
new HashMap<Character, Integer>() {{ put('d', 2); put('.', 4); }}, // 状态 1
new HashMap<Character, Integer>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 状态 2
new HashMap<Character, Integer>() {{ put('d', 3); put('e', 5); put(' ', 8); }}, // 状态 3
new HashMap<Character, Integer>() {{ put('d', 3); }}, // 状态 4
new HashMap<Character, Integer>() {{ put('s', 6); put('d', 7); }}, // 状态 5
new HashMap<Character, Integer>() {{ put('d', 7); }}, // 状态 6
new HashMap<Character, Integer>() {{ put('d', 7); put(' ', 8); }}, // 状态 7
new HashMap<Character, Integer>() {{ put(' ', 8); }} // 状态 8
};
// 初使状态 0
int p = 0;
// 用户存储当前字符
char item;
for (char c : s.toCharArray()) {
if (c == '.' || c == ' ') item = c;
else if (c == 'e' || c == 'E') item = 'e';
else if (c == '+' || c == '-') item = 's';
else if (c >= '0' && c <= '9') item = 'd';
else item = '#';
// 如果状态机不存在些字符,返回 false
if (!maps[p].containsKey(item)) return false;
// 跳转到下一个状态
p = (int) maps[p].get(item);
}
// 结束状态有 2, 3, 7, 8
return p == 2 || p == 3 || p == 7 || p == 8;
}
}