【LeetCode|编译原理】剑指 Offer 20. 表示数值的字符串

news2024/9/20 18:44:36

文章目录

    • 题目链接
    • 标签
    • 步骤
    • 实现代码(C++)

题目链接

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

标签

有限状态自动机(FA)

步骤

Step1. 去除字符串左、右空格;

string strip(string str) {
    int start = -1;
    for (int i = 0; i < str.length(); i++) {
        if (str[i] != ' ') {
            start = i;
            break;
        }
    }
    if (start == -1) return str;
    int end = -1;
    for (int i = str.length() - 1; i >= 0; i--) {
        if (str[i] != ' ') {
            end = i;
            break;
        }
    }
    return str.substr(start, end - start + 1);
}

Step2. 写出正规文法:
S → ( + ∣ − ∣ ϵ ) ( I N T ∣ F L O A T ) E X P I N T → d i g i t ( d i g i t ) ∗ F L O A T → d i g i t ( d i g i t ) ∗ . ( d i g i t ) ∗ ∣ . d i g i t ( d i g i t ) ∗ E X P → ( + ∣ − ∣ ϵ ) I N T ∣ ϵ \mathrm{S}\rightarrow (+|-|\mathrm{\epsilon )(INT}|\mathrm{FLOAT)EXP} \\ \mathrm{INT}\rightarrow \mathrm{digit(digit)}^* \\ \mathrm{FLOAT}\rightarrow \mathrm{digit(digit)}^*.(\mathrm{digit)}^*|.\mathrm{digit(digit)}^* \\ \mathrm{EXP}\rightarrow (+|-|\mathrm{\epsilon )INT}|\mathrm{\epsilon} S(+ϵ)(INTFLOAT)EXPINTdigit(digit)FLOATdigit(digit).(digit)∣.digit(digit)EXP(+ϵ)INTϵ

Step3. 根据正规文法画出NFA:

NFA

Step4. 根据NFA写代码:从左至右遍历,遇到包含ε的转移,单独处理。遍历完成后,看状态是否为终态(2、4、7),是则返回 true,否则 false。

for (int i = 0; i < str.length(); i++) {
    char ch = str[i];
    switch (state) {
        case 0:
            if (isFlag(ch)) {
                state = 1;
            } else {
                state = 1;
                i--; // 处理ε情况,i--
            }
            break;
        case 1:
            if (isDigit(ch)) {
                state = 2;
            } else if (ch == '.') {
                state = 3;
            } else {
                return false;
            }
            break;
        case 2:
            if (isDigit(ch)) {
                state = 2;
            } else if (ch == '.') {
                state = 4;
            } else if (ch == 'e' || ch == 'E') {
                state = 5;
            } else {
                return false;
            }
            break;
        case 3:
            if (isDigit(ch)) {
                state = 4;
            } else {
                return false;
            }
            break;
        case 4:
            if (isDigit(ch)) {
                state = 4;
            } else if (ch == 'e' || ch == 'E') {
                state = 5;
            } else {
                return false;
            }
            break;
        case 5:
            if (isFlag(ch)) {
                state = 6;
            } else {
                state = 6;
                i--; // 处理ε情况,i--
            } 
            break;
        case 6:
            if (isDigit(ch)) {
                state = 7;
            } else {
                return false;
            }
            break;
        case 7:
            if (isDigit(ch)) {
                state = 7;
            } else {
                return false;
            }
            break;
    }
}

实现代码(C++)

class Solution {
public:
    string strip(string str) {
        int start = -1;
        for (int i = 0; i < str.length(); i++) {
            if (str[i] != ' ') {
                start = i;
                break;
            }
        }
        if (start == -1) return str;
        int end = -1;
        for (int i = str.length() - 1; i >= 0; i--) {
            if (str[i] != ' ') {
                end = i;
                break;
            }
        }
        return str.substr(start, end - start + 1);
    }
    bool isDigit(char c) {
        if (c >= '0' && c <= '9') {
            return true;
        }
        return false;
    }
    bool isFlag(char c) {
        if (c == '+' || c == '-') {
            return true;
        }
        return false;
    }
    bool isNumber(string s) {
        int len = s.length();
        // step 1/4:去除首尾空格
        string str = strip(s);
        int state = 0;
        for (int i = 0; i < str.length(); i++) {
            char ch = str[i];
            switch (state) {
                case 0:
                    if (isFlag(ch)) {
                        state = 1;
                    } else {
                        state = 1;
                        i--;
                    }
                    break;
                case 1:
                    if (isDigit(ch)) {
                        state = 2;
                    } else if (ch == '.') {
                        state = 3;
                    } else {
                        return false;
                    }
                    break;
                case 2:
                    if (isDigit(ch)) {
                        state = 2;
                    } else if (ch == '.') {
                        state = 4;
                    } else if (ch == 'e' || ch == 'E') {
                        state = 5;
                    } else {
                        return false;
                    }
                    break;
                case 3:
                    if (isDigit(ch)) {
                        state = 4;
                    } else {
                        return false;
                    }
                    break;
                case 4:
                    if (isDigit(ch)) {
                        state = 4;
                    } else if (ch == 'e' || ch == 'E') {
                        state = 5;
                    } else {
                        return false;
                    }
                    break;
                case 5:
                    if (isFlag(ch)) {
                        state = 6;
                    } else {
                        state = 6;
                        i--;
                    } 
                    break;
                case 6:
                    if (isDigit(ch)) {
                        state = 7;
                    } else {
                        return false;
                    }
                    break;
                case 7:
                    if (isDigit(ch)) {
                        state = 7;
                    } else {
                        return false;
                    }
                    break;
            }
        }
        string finalState = "247";
        return finalState.find(state+'0', 0) == string::npos ? false : true;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/815861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个CSS渐变下划线效果的实用技巧

下划线它只用到了CSS的渐变背景、背景大小调整、位置设置、鼠标hover 过渡等基本属性和技巧。 分析与实现 我们先看一下基本的结构。 <h2 class"title"><span>你好啊&#xff0c;嘴巴嘟嘟</span></h2>然后我们给span 元素添加一个线性渐变…

如何在Windows11中备份指定文件夹?

在现代的信息化时代&#xff0c;无论工作场所还是日常生活&#xff0c;文件的使用频率已经越来越高。对于那些经常操作特定文件夹的用户&#xff0c;他们可能会经常进行文件的修改、新增以及删除操作。为了防止文件丢失导致的困扰&#xff0c;定期备份指定文件夹显得尤为关键。…

java医院电子病历系统源码:云端SaaS服务 前后端分离模式开发和部署

电子病历系统是什么&#xff1f; 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息&…

晋级榜单揭晓!华秋第九届硬创大赛-华南分赛区路演成功举办

7月21日&#xff0c;第十五届深创赛福田预选赛区暨华秋第九届硬创大赛华南分赛区决赛路演活动在深圳华强科创广场成功举办。活动由深圳华秋电子有限公司&#xff08;以下简称 华秋 &#xff09;、深圳市福田区新一代信息技术产业链党委、深圳新一代产业园、微纳研究院、华强科创…

关于运发的知识点123(个人笔记 持续更新)

前言&#xff1a;作为一个物联网的小辣鸡&#xff0c;硬件设计水平不能说没有&#xff0c;只能说一点点。 正好要做新项目&#xff0c;自己学着去处理信号&#xff0c;滤波&#xff0c;在这里做一点笔记。 参考书一&#xff1a;杨建国老师《新概念模拟电路》.pdf 参考书二&…

如何卸载华为手机内置app

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近自用的华为手机的存储空间快满了&#xff0c;想把手机内置的app清理一下。然后到网上搜索解决方案&#xff0c;大致弄明白了步骤。主要是通过华为手机…

23款奔驰GLE450豪华型升级AMG直瀑式中网,战斗感立马提升了一个档次

奔驰GLE450豪华型升级AMG竖杠中网前进气格栅&#xff0c;AMG中网竖杠格栅&#xff0c;镀铬饰条呈圆弧状&#xff0c;色泽均衡&#xff0c;质感顺滑&#xff0c;极富冲击力。AMG专属字标&#xff0c;与中网卡扣装配紧密&#xff0c;凸显AMG的身份象征&#xff0c;点睛之笔又不显…

HC32F448-小华MCU

由于要开发和学习使用低成本MCU&#xff0c;这里记录下小华半导体HC32F448的手册参数 芯片官网&#xff08;HC32F448MCTI-LQFP80&#xff09; 小华半导体有限公司 (xhsc.com.cn) HC32F448 系列MCU是32位的ARM Cortex-M4微控制器。最高工作频率 200MHz&#xff0c;最大 256KB 的…

中小学分班查询系统0成本制作方法公布了,人人可用

传统的学生分班查询平台通常需要进行专业的技术开发&#xff0c;以实现学生查询和查看分班信息的功能。这个过程涉及到软件开发、数据库设计、系统集成等多个环节&#xff0c;需要有一支专业的技术团队来完成。 然而&#xff0c;这样的技术开发和维护过程需要耗费大量的经济成…

微信小程序+web数据库的开发实践

前言 生活中使用微信小程序的场景越来越多&#xff0c;它实现了用户对于应用“触手可及、用完即走”的理想需求。微信小程序的开发难度也低于APP的开发制作&#xff0c;使用它会更便利、低成本、高经济效益。 但是要完成一个小程序涉及到的技术栈比较多&#xff0c;要开发的模…

RTT(RT-Thread)线程管理(1.2W字详细讲解)

目录 RTT线程管理 线程管理特点 线程工作机制 线程控制块 线程属性 线程状态之间切换 线程相关操作 创建和删除线程 创建线程 删除线程 动态创建线程实例 启动线程 初始化和脱离线程 初始化线程 脱离线程 静态创建线程实例 线程辅助函数 获得当前线程 让出处…

redisson分布式锁学习

什么是分布式锁? 当有多个线程并发访问同一共享数据时,如果多个线程同时都去修改这个共享数据,且修改操作不是原子操作,就很有可能出现线程安全问题&#xff0c;而产生线程安全问题的根本原因是缺乏对共享数据访问的同步和互斥。 为了解决这个问题&#xff0c;通常我们的做法…

pgsql 查看某个表建立了那些索引sql

执行以下sql&#xff1a; SELECTns.nspname as schema_name,tab.relname as table_name,cls.relname as index_name,am.amname as index_type,idx.indisprimary as is_primary,idx.indisunique as is_unique FROMpg_index idx INNER JOIN pg_class cls ON cls.oididx.indexrel…

系统集成|第八章(笔记)

目录 第八章 进度管理8.1 主要过程8.1.1 规划进度管理8.1.2 定义活动8.1.3 排列活动顺序8.1.4 估算活动资源8.1.5 估算活动持续时间8.1.6 制定进度计划8.1.7 控制进度 8.2 注意与问题 上篇&#xff1a;第七章、范围管理 第八章 进度管理 8.1 主要过程 包括&#xff1a; 规划进…

0day用友-NC-Cloud远程代码执行漏洞(全版本通杀)

漏洞描述 用友NC Cloud大型企业数字化平台,深度应用新一代数字智能技术,完全基于云原生架构,打造开放、互联、融合、智能的一体化云平台,聚焦数智化管理、数智化经营、数智化商业等三大企业数智化转型战略方向,提供涵盖数字营销、财务共享、全球司库、智能制造、敏捷供应…

强化学习QLearning 进行迷宫游戏和代码

强化学习是机器学习里面的一个分支。它强调基于环境而探索行动、学习&#xff0c;以取得最大化的预期收益。其灵感来源于心理学中的行为主义理论&#xff0c;既有机体如何在环境给予的奖励或者惩罚的刺激下&#xff0c;逐步形成对刺激的预期&#xff0c;产生能够最大利益的习惯…

计算机视觉实验:图像增强应用实践

本次实验主要从基于统计、函数映射的图像增强方法和基于滤波的图像增强方法两种方法中对一些图像增强的算法进行实现。主要的编程语言为python&#xff0c;调用了python自带的PIL图像库用于读取图像&#xff0c;利用numpy进行图像运算&#xff0c;最后使用opencv第三方库进行对…

奇富科技联合哈银消金获《亚洲银行家》中国最佳信贷项目奖

7月28日&#xff0c;全球金融领域最具含金量的奖项之一《亚洲银行家》颁布2023年度奖项&#xff0c;奇富科技荣获“中国最佳信贷项目”殊荣。值得关注的是&#xff0c;该奖项由奇富科技与哈银消金联合获得&#xff0c;双方联合获奖&#xff0c;是主办方对奇富科技全面赋能金融机…

【限时优惠】红帽openstack管理课程(CL210) 即将开课

课程介绍 通过实验室操作练习&#xff0c;学员将能够深入学习红帽企业 Linux OpenStack 平台各服务的手动安装方法&#xff0c;还将了解 OpenStack 开发社区的未来发展计划。 培训地点&#xff1a; 线下面授&#xff1a;苏州市姑苏区干将东路666号401室&#xff1b; 远程…

Java平台标准版 8 文档

Java 平台标准版 8 文档 (oracle.com)https://docs.oracle.com/javase/8/docs/ JDK 8 是 JRE 8 的超集&#xff0c;包含 JRE 8&#xff0c;以及编译器和调试器等工具&#xff0c;如 开发小程序和应用程序。JRE 8 提供了库&#xff0c; Java 虚拟机 &#xff08;JVM&#xff09;…