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相关推荐

  1. Formal Languages and Compilers 笔记教程 第一章 有限自动机与正则语言 (Finite Automata and Regular Languages)

    Formal Languages and Compilers (形式语言和编译器) 的 自学笔记兼学习教程. 笔记作者介绍:大爽歌, b站小UP主 ,编程1对1辅导老师. 1 Finite Autom ...

  2. 词法分析(NFA与DFA)

    词法分析(1)---词法分析的有关概念以及转换图 词法分析是编译的第一个阶段,前面简介中也谈到过词法分析器的任务就是: 字符流------>词法记号流 这里词法分析和语法分析会交错进行,也就是说 ...

  3. NFA、DFA模拟、正则表达式转NFA、NFA转DFA、DFA转正则、DFA最小化的python实现项目

    各类自动机模拟实现 项目地址: https://github.com/HuiyuanYan/automaton_simulation 注:这个github链接必须复制重新在浏览器打开,不能通过CSDN ...

  4. 证明与计算(7): 有限状态机(Finite State Machine)

    什么是有限状态机(Finite State Machine)? 什么是确定性有限状态机(deterministic finite automaton, DFA )? 什么是非确定性有限状态机(nond ...

  5. 字典树实现_学习NLP的第3天——字典树

    通过<自然语言处理入门>(何晗)的第2章来学习一下分词的常用算法,因此以下的实现方法都是通过HanLP实现的.这里主要记录我在学习过程中整理的知识.调试的代码和心得理解,以供其他学习的朋友 ...

  6. 图灵机二义性_编译原理知识汇总

    编译原理 第一章 引言 1.从面向机器的语言到面向人类的语言 汇编指令:用符号表示的指令被称为汇编指令 汇编语言:汇编指令的集合称为汇编语言 2.语言之间的翻译 转换(也被称为预处理):高级语言之间的 ...

  7. 中文分词与关键词提取概述

    本文基于题库查重需求实现过程及<NLP自然语言处理原理与实践>学习过程总结得出.定有不足之处,恳请指出. 介绍 中文分词是自然语言处理(NLP)在中文环境下,首要解决的问题.主要难点为中文 ...

  8. 悟空分词与mysql结合_中文分词与关键词提取实践小结

    本文基于题库查重需求实现过程及<NLP自然语言处理原理与实践>学习过程总结得出.定有不足之处,恳请指出. 基本概念 评价指标 一般,中文分词从Precision.Recall.F-scor ...

  9. 双数组Trie的一种实现

    An Implementation of Double-Array Trie 双数组Trie的一种实现 原文:http://linux.thai.net/~thep/datrie/datrie.htm ...

  10. Double_array trie

    An Implementation of Double-Array Trie Contents What is Trie? What Does It Take to Implement a Trie? ...

最新文章

  1. 爆款不是运气:网易产品布局背后的6大标准框架
  2. python制作收费标准_在Python中做一次简单定制1
  3. layui多文件上传讲解_layui d多文件上传(示例代码)
  4. Android URI简介
  5. 计算机描绘的基因结构图,利用IBS软件画基因mRNA的结构图
  6. Markdown 官方教程
  7. 微信小程序腾讯云实时语音转写
  8. 凯恩帝绝对坐标清零_凯恩帝 K90T i 数控车床系统使用手册分享
  9. 淘宝签到红包商品直达链接,如何转化为自己的链接?
  10. 23.方法重写的本质与虚方法表的使用
  11. php手机页面中文输出乱码,如何解决php输出中文乱码的问题?
  12. 打外星生物的塔防java_《异形防御者》测评:外星人也玩塔防游戏
  13. Teambition网盘 批量下载 下载文件夹 递归下载
  14. 英雄对决服务器未响应,lol点开始游戏没反应怎么办 完整解决办法一览
  15. java 四边形_Java 实例 – 打印平行四边形
  16. 接口开放平台,我的一些思考
  17. 【优化系列】汇编优化技术(九):WebAssembly(wasm)平台SIMD优化
  18. 解决删除chrome注册表残留问题
  19. Fiddler中Response 的Raw乱码问题解决
  20. 图像梯度特征的常用算子:Sobel、Prewitt、Roberts

热门文章

  1. selenium借助pywinauto工具上传附件
  2. 手机端网页-微信授权登录
  3. mysql (1) 聚集索引和非聚集索引
  4. 网站seo运营中如何精确预测热门搜索关键词?
  5. CPU、内存、硬盘、显卡、显示器之间的关系
  6. 数位板的主要参数解析
  7. 索尼电视未能找到服务器是怎么回事,索尼电视进行网络设置或尝试访问互联网内容时出现错误...
  8. 什么是服务器防护,什么是硬防?什么是软防?
  9. RFID技术在物联网中有哪些应用
  10. oracle 限制条数的查询