剑指 Offer 20. 表示数值的字符串

image.png
image.png
剑指 Offer 20. 表示数值的字符串 - 图3

图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5dkal2/

使用状态机

  1. public class Solution {
  2. public boolean isNumber(String s) {
  3. // 定义状态机
  4. Map[] maps = {
  5. new HashMap<Character, Integer>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, // 状态 0
  6. new HashMap<Character, Integer>() {{ put('d', 2); put('.', 4); }}, // 状态 1
  7. new HashMap<Character, Integer>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 状态 2
  8. new HashMap<Character, Integer>() {{ put('d', 3); put('e', 5); put(' ', 8); }}, // 状态 3
  9. new HashMap<Character, Integer>() {{ put('d', 3); }}, // 状态 4
  10. new HashMap<Character, Integer>() {{ put('s', 6); put('d', 7); }}, // 状态 5
  11. new HashMap<Character, Integer>() {{ put('d', 7); }}, // 状态 6
  12. new HashMap<Character, Integer>() {{ put('d', 7); put(' ', 8); }}, // 状态 7
  13. new HashMap<Character, Integer>() {{ put(' ', 8); }} // 状态 8
  14. };
  15. // 初使状态 0
  16. int p = 0;
  17. // 用户存储当前字符
  18. char item;
  19. for (char c : s.toCharArray()) {
  20. if (c == '.' || c == ' ') item = c;
  21. else if (c == 'e' || c == 'E') item = 'e';
  22. else if (c == '+' || c == '-') item = 's';
  23. else if (c >= '0' && c <= '9') item = 'd';
  24. else item = '#';
  25. // 如果状态机不存在些字符,返回 false
  26. if (!maps[p].containsKey(item)) return false;
  27. // 跳转到下一个状态
  28. p = (int) maps[p].get(item);
  29. }
  30. // 结束状态有 2, 3, 7, 8
  31. return p == 2 || p == 3 || p == 7 || p == 8;
  32. }
  33. }