首页 > 其他分享 >使用有限状态自动机解决剑指 Offer 20. 表示数值的字符串

使用有限状态自动机解决剑指 Offer 20. 表示数值的字符串

时间:2023-02-25 20:34:48浏览次数:73  
标签:theElse 20 sl Offer space && defeat 自动机 pm

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

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 'e' 或 'E' ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-'
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点 '.'
    2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
    3. 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+' 或 '-'
  2. 至少一位数字

部分数值列举如下:

  • ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

  • ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

 

示例 1:

输入:s = "0"
输出:true

示例 2:

输入:s = "e"
输出:false

示例 3:

输入:s = "."
输出:false

示例 4:

输入:s = "    .1  "
输出:true

 

提示:

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

本题链接:剑指 Offer 20. 表示数值的字符串 - 力扣(LeetCode)

此题我第一次使用暴力方法:

 1 class Solution {
 2 public:
 3     bool isNumber(string s) {
 4         int sl=s.length();
 5         int p=0;
 6         while(p<sl&&s[p]==' ')p++;
 7         if(p<sl&&(s[p]=='+'||s[p]=='-'))p++;
 8         if(p<sl&&(s[p]>='0'&&s[p]<='9')){
 9             while(p<sl&&(s[p]>='0'&&s[p]<='9'))p++;
10             int ttp=p;
11             while(ttp<sl&&(s[ttp]==' '))ttp++;
12             if(ttp>=sl)return true;
13             if(p<sl&&s[p]=='.'){
14                 if(p>=sl-1)return true;
15                 p++;
16                 int tp=p;
17                 while(p<sl&&(s[p]>='0'&&s[p]<='9'))p++;
18                 int tttp=p;
19                 while(tttp<sl&&(s[tttp]==' '))tttp++;
20                 if(p>=sl||tttp>=sl)return true;
21                 while(tp<sl&&(s[tp]==' '))tp++;
22                 if(tp>=sl)return true;
23             }
24             if(p<sl&&(s[p]=='E'||s[p]=='e')){
25                 if(p<sl-1)p++;
26                 if(p<sl&&(s[p]=='+'||s[p]=='-'))p++;
27                 if(p<sl&&(s[p]>='0'&&s[p]<='9')){
28                     while(p<sl&&(s[p]>='0'&&s[p]<='9'))p++;
29                     while(p<sl&&(s[p]==' '))p++;
30                     if(p>=sl)return true;
31                 }
32             }
33         }else{
34             if(p<sl&&s[p]=='.'){
35                 if(p<sl-1)p++;
36                 if(p<sl&&(s[p]>='0'&&s[p]<='9')){
37                     while(p<sl&&(s[p]>='0'&&s[p]<='9'))p++;
38                     if(p<sl&&(s[p]=='E'||s[p]=='e')){
39                         if(p<sl-1)p++;
40                         if(p<sl&&(s[p]=='+'||s[p]=='-'))p++;
41                         if(p<sl&&(s[p]>='0'&&s[p]<='9')){
42                             while(p<sl&&(s[p]>='0'&&s[p]<='9'))p++;
43                             while(p<sl&&(s[p]==' '))p++;
44                             if(p>=sl)return true;
45                         }
46                     }
47                     while(p<sl&&(s[p]==' '))p++;
48                 }
49                 if(p>=sl)return true;
50             }
51         }
52         return false;
53     }
54 };

第二次学习了enum枚举和有限状态自动机的概念,结合官方题解,重新做了一遍,代码如下:

  1 class Solution {
  2 public:
  3     enum state{
  4     start,
  5     sign,
  6     num,
  7     dot,
  8     dotWithoutNum,
  9     decimal,
 10     exp,
 11     expSign,
 12     expNum,
 13     end,
 14     defeat
 15     };
 16     enum CharType{
 17         space,
 18         pm,
 19         in,
 20         e,
 21         d,
 22         theElse
 23     };
 24     CharType judge(char c){
 25         if(c>='0'&&c<='9')return in;
 26         if(c==' ')return space;
 27         if(c=='e'||c=='E')return e;
 28         if(c=='.')return d;
 29         if(c=='+'||c=='-')return pm;
 30         return theElse;
 31     }
 32     bool isNumber(string s) {
 33         unordered_map<state,unordered_map<CharType,state>>m{
 34             {start,{
 35                 {space,start},
 36                 {pm,sign},
 37                 {in,num},
 38                 {e,defeat},
 39                 {d,dotWithoutNum},
 40                 {theElse,defeat}
 41             }},
 42             {sign,{
 43                 {space,defeat},
 44                 {pm,defeat},
 45                 {in,num},
 46                 {e,defeat},
 47                 {d,dotWithoutNum},
 48                 {theElse,defeat}
 49             }},
 50             {num,{
 51                 {space,end},
 52                 {pm,defeat},
 53                 {in,num},
 54                 {e,exp},
 55                 {d,dot},
 56                 {theElse,defeat}
 57             }},
 58             {dot,{
 59                 {space,end},
 60                 {pm,defeat},
 61                 {in,decimal},
 62                 {e,exp},
 63                 {d,defeat},
 64                 {theElse,defeat}
 65             }},
 66             {dotWithoutNum,{
 67                 {space,defeat},
 68                 {pm,defeat},
 69                 {in,decimal},
 70                 {e,defeat},
 71                 {d,defeat},
 72                 {theElse,defeat}
 73             }},
 74             {decimal,{
 75                 {space,end},
 76                 {pm,defeat},
 77                 {in,decimal},
 78                 {e,exp},
 79                 {d,defeat},
 80                 {theElse,defeat}
 81             }},
 82             {exp,{
 83                 {space,defeat},
 84                 {pm,expSign},
 85                 {in,expNum},
 86                 {e,defeat},
 87                 {d,defeat},
 88                 {theElse,defeat}
 89             }},
 90             {expSign,{
 91                 {space,defeat},
 92                 {pm,defeat},
 93                 {in,expNum},
 94                 {e,defeat},
 95                 {d,defeat},
 96                 {theElse,defeat}
 97             }},
 98             {expNum,{
 99                 {space,end},
100                 {pm,defeat},
101                 {in,expNum},
102                 {e,defeat},
103                 {d,defeat},
104                 {theElse,defeat}
105             }},
106             {end,{
107                 {space,end},
108                 {pm,defeat},
109                 {in,defeat},
110                 {e,defeat},
111                 {d,defeat},
112                 {theElse,defeat}
113             }},
114             {defeat,{
115                 {space,defeat},
116                 {pm,defeat},
117                 {in,defeat},
118                 {e,defeat},
119                 {d,defeat},
120                 {theElse,defeat}
121             }},
122         };
123         int sl=s.length();
124         state st=start;
125         CharType ct;
126         for(int i=0;i<sl;++i){
127             ct=judge(s[i]);
128             st=m[st][ct];
129             //if(st==defeat)return false;
130         }
131         if(st==end||st==num||st==decimal||st==dot||st==expNum)return true;
132         return false;
133     }
134 };

标签:theElse,20,sl,Offer,space,&&,defeat,自动机,pm
From: https://www.cnblogs.com/vusblog/p/17155296.html

相关文章

  • 2023.2.24AcWing蓝桥杯集训·每日一题
    今日复习的知识点为递归。递归对于笔者而言是个比较难以理解的知识点,后续会多进行递归题目的练习。AcWing1497.树的遍历题目描述一个二叉树,树中每个节点的权值互不相同......
  • 2023.2.25每日总结
    今天学习了控件toolbarandroid:layout_width="match_parent"android:layout__height="?attr/actionBarSize"android:background="#fff00app:navigationlcon="@dra......
  • 2023.2.25周六每日总结
    今天根据b站得javaweb教程学习了两个小时,成功理解了数据库的链接原理,以及connection的使用方法,对不同版本的mysql之间连接的区别有了进一步的理解所以利用jdbc在java中......
  • 2023.2.25AcWing蓝桥杯集训·每日一题
    今日复习的知识点为并查集。AcWing1249.亲戚题目描述或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整......
  • 2023/2/25
    学习SQLite、事务管理、外部存储空间、应用程序声明周期以及JetpackRoom的简单使用是非常有意义的。这些都是Android开发中非常基础和重要的概念,掌握它们可以使我们更好地......
  • 2023年内部订阅
    2023年3月更新高速线路针对CN2/GIA进行优化,从大阪出发,乘坐新干线来到东京微软交换站,然后乘坐飞机越过海峡来到福州,再通过各自的电脑来到家中。大阪府专线测速结果: ......
  • C/C++停车场管理系统[2023-02-25]
    C/C++停车场管理系统[2023-02-25]选题九:停车场管理系统[问题描述]1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。2)每一组输入......
  • 三天吃透MySQL八股文(2023最新整理)
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • test20230225考试总结
    前言Ihatequestionsthatalreadyexist!!我讨厌原题!!赛时得分明细:ABCDEFTotalRank10010010560443106A.P1993小K的农场题面给定长度为......
  • 20201217王菁-电子书阅读
    微信读书优势、特点阐述    使用微信读书已经好久,看过的书也有许多本。不得不说,我认为微信读书最大的好处就是——少了很多买书钱。纸质书好贵。。    真心觉得......