leetcode#8 deterministic finite automaton, DFA
leetcode#8 deterministic finite automaton, DFA
题目
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:1、读入字符串并丢弃无用的前导空格
2、检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
3、读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
4、将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
5、如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
6、返回整数作为最终结果。注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
确定有限状态机
1、先把需要输入的字符分类
/*0 ' '
1 '+','-'
2 number
3 other*/int get_col(char c){if (c == ' ')return 0;else if (c == '+' || c == '-')return 1;else if (c >= '0' && c <= '9')return 2;elsereturn 3;}
2、确定状态
/*起始状态 "start"
符号输入 "signed"
结束 "end"
数字输入 "number"*/unordered_map<string, vector<string>> mp = {{"start", {"start", "signed", "number", "end"}},{"signed", {"end", "end", "number", "end"}},{"number", {"end", "end", "number", "end"}},{"end", {"end", "end", "end", "end"}}};
3、状态转换
void get(char c){state = mp[state][get_col(c)];if (state == "signed"&&c=='-')flag = 1;else if (state == "number"){ans = ans * 10 + c - '0';if (!flag)ans = min(ans, (long long)INT_MAX);elseans = min(ans, -(long long)INT_MIN);}}
AC代码
class Automaton
{public:long long ans = 0;bool flag = 0;string state = "start";unordered_map<string, vector<string>> mp = {{"start", {"start", "signed", "number", "end"}},{"signed", {"end", "end", "number", "end"}},{"number", {"end", "end", "number", "end"}},{"end", {"end", "end", "end", "end"}}};int get_col(char c){if (c == ' ')return 0;else if (c == '+' || c == '-')return 1;else if (c >= '0' && c <= '9')return 2;elsereturn 3;}void get(char c){state = mp[state][get_col(c)];if (state == "signed"&&c=='-')flag = 1;else if (state == "number"){ans = ans * 10 + c - '0';if (!flag)ans = min(ans, (long long)INT_MAX);elseans = min(ans, -(long long)INT_MIN);}}
};class Solution
{public:int myAtoi(string s){Automaton a;for (int i = 0; i < s.length(); ++i)a.get(s[i]);if(a.flag)a.ans = -a.ans;return (int)a.ans;}
};
链接:leetcode P8.
leetcode#8 deterministic finite automaton, DFA相关推荐
- Formal Languages and Compilers 笔记教程 第一章 有限自动机与正则语言 (Finite Automata and Regular Languages)
Formal Languages and Compilers (形式语言和编译器) 的 自学笔记兼学习教程. 笔记作者介绍:大爽歌, b站小UP主 ,编程1对1辅导老师. 1 Finite Autom ...
- 词法分析(NFA与DFA)
词法分析(1)---词法分析的有关概念以及转换图 词法分析是编译的第一个阶段,前面简介中也谈到过词法分析器的任务就是: 字符流------>词法记号流 这里词法分析和语法分析会交错进行,也就是说 ...
- NFA、DFA模拟、正则表达式转NFA、NFA转DFA、DFA转正则、DFA最小化的python实现项目
各类自动机模拟实现 项目地址: https://github.com/HuiyuanYan/automaton_simulation 注:这个github链接必须复制重新在浏览器打开,不能通过CSDN ...
- 证明与计算(7): 有限状态机(Finite State Machine)
什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...
- 字典树实现_学习NLP的第3天——字典树
通过<自然语言处理入门>(何晗)的第2章来学习一下分词的常用算法,因此以下的实现方法都是通过HanLP实现的.这里主要记录我在学习过程中整理的知识.调试的代码和心得理解,以供其他学习的朋友 ...
- 图灵机二义性_编译原理知识汇总
编译原理 第一章 引言 1.从面向机器的语言到面向人类的语言 汇编指令:用符号表示的指令被称为汇编指令 汇编语言:汇编指令的集合称为汇编语言 2.语言之间的翻译 转换(也被称为预处理):高级语言之间的 ...
- 中文分词与关键词提取概述
本文基于题库查重需求实现过程及<NLP自然语言处理原理与实践>学习过程总结得出.定有不足之处,恳请指出. 介绍 中文分词是自然语言处理(NLP)在中文环境下,首要解决的问题.主要难点为中文 ...
- 悟空分词与mysql结合_中文分词与关键词提取实践小结
本文基于题库查重需求实现过程及<NLP自然语言处理原理与实践>学习过程总结得出.定有不足之处,恳请指出. 基本概念 评价指标 一般,中文分词从Precision.Recall.F-scor ...
- 双数组Trie的一种实现
An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...
- Double_array trie
An Implementation of Double-Array Trie Contents What is Trie? What Does It Take to Implement a Trie? ...
最新文章
- 爆款不是运气:网易产品布局背后的6大标准框架
- python制作收费标准_在Python中做一次简单定制1
- layui多文件上传讲解_layui d多文件上传(示例代码)
- Android URI简介
- 计算机描绘的基因结构图,利用IBS软件画基因mRNA的结构图
- Markdown 官方教程
- 微信小程序腾讯云实时语音转写
- 凯恩帝绝对坐标清零_凯恩帝 K90T i 数控车床系统使用手册分享
- 淘宝签到红包商品直达链接,如何转化为自己的链接?
- 23.方法重写的本质与虚方法表的使用
- php手机页面中文输出乱码,如何解决php输出中文乱码的问题?
- 打外星生物的塔防java_《异形防御者》测评:外星人也玩塔防游戏
- Teambition网盘 批量下载 下载文件夹 递归下载
- 英雄对决服务器未响应,lol点开始游戏没反应怎么办 完整解决办法一览
- java 四边形_Java 实例 – 打印平行四边形
- 接口开放平台,我的一些思考
- 【优化系列】汇编优化技术(九):WebAssembly(wasm)平台SIMD优化
- 解决删除chrome注册表残留问题
- Fiddler中Response 的Raw乱码问题解决
- 图像梯度特征的常用算子:Sobel、Prewitt、Roberts