LeetCode224基本计算器用DFA实现超简洁

痛点

题目是:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
比如:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

这题有点类似编译器设计,特点是状态很多,很容易迷失在if-else中,所以使用有限状态机DFA来解决

思路详解

DFA(deterministic finite automation)就是一系列状态的迁移,大家可以试着画下图,就如下4种状态转来转去,很简单的
在这里插入图片描述

上图中我画了起始态的迁移示例(红色字体),符号态的迁移示例(蓝色字体),其他不画了,道理一样的,大家也可以自己画下

状态

0-start 世界起始态;
1-sig 置加号或减号的状态;
2-number 输入数字时状态;
3-end 世界结束态;

迁移条件:输入的字符的种类驱动了状态迁移

0是( 1 +或- 2是数字 3是) 4是其他非法字符

注意事项:
  1. 空格事先去掉,简化代码
  2. 起始态和结束态,不仅是字符串开始和结束,"("号也会开始一个新的世界,原来的世界入栈

代码(附带详细注解)

/**
 * @param {string} s
 * @return {number}
 */
const DFA = [
    [0, 1, 2, 3, 3], //当状态是起始态时,遇到各种字符类型所跳转到的下个状态,比如0是(,遇到0还是起始态,只不过是下个世界的
    [0, 3, 2, 3, 3],
    [3, 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值