剑指 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); }}, // 状态 0new HashMap<Character, Integer>() {{ put('d', 2); put('.', 4); }}, // 状态 1new HashMap<Character, Integer>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 状态 2new HashMap<Character, Integer>() {{ put('d', 3); put('e', 5); put(' ', 8); }}, // 状态 3new HashMap<Character, Integer>() {{ put('d', 3); }}, // 状态 4new HashMap<Character, Integer>() {{ put('s', 6); put('d', 7); }}, // 状态 5new HashMap<Character, Integer>() {{ put('d', 7); }}, // 状态 6new HashMap<Character, Integer>() {{ put('d', 7); put(' ', 8); }}, // 状态 7new HashMap<Character, Integer>() {{ put(' ', 8); }} // 状态 8};// 初使状态 0int 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 = '#';// 如果状态机不存在些字符,返回 falseif (!maps[p].containsKey(item)) return false;// 跳转到下一个状态p = (int) maps[p].get(item);}// 结束状态有 2, 3, 7, 8return p == 2 || p == 3 || p == 7 || p == 8;}}
