痛点
题目是:给你一个字符串表达式 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是其他非法字符
注意事项:
- 空格事先去掉,简化代码
- 起始态和结束态,不仅是字符串开始和结束,"("号也会开始一个新的世界,原来的世界入栈
代码(附带详细注解)
/**
* @param {string} s
* @return {number}
*/
const DFA = [
[0, 1, 2, 3, 3], //当状态是起始态时,遇到各种字符类型所跳转到的下个状态,比如0是(,遇到0还是起始态,只不过是下个世界的
[0, 3, 2, 3, 3],
[3, 1