DFA法
思路:
DFA即Deterministic Finite Automaton,也就是确定的有穷自动机,通过当前状态和要发生的事务获取到下一个状态。
在本题中,我们可以发现在遍历字符串字符时,可能出现的4种类型:① 空格 ② 正负号 ③ 数字 ④ 无效字符 。初始化一个当前状态,在处理每种类型字符时,更新当前状态,直到状态为截止退出。当前状态在遇到每一种类型字符对应更新的状态如下:
根据当前状态,做出对应处理:
start:不做任何操作,继续遍历下一个
signed:记录符号,继续遍历下一个
in_number:记录数字,继续遍历下一个
end:截止退出
这里要注意的是,在返回结果时要根据题目中要求的取值范围做相应处理
代码:
INT_MAX = 2 ** 31 - 1 INT_MIN = -2 ** 31 class Automaton: def __init__(self): self.state = 'start' self.sign = 1 self.ans = 0 self.table = { 'start': ['start', 'signed', 'in_number', 'end'], 'signed': ['end', 'end', 'in_number', 'end'], 'in_number': ['end', 'end', 'in_number', 'end'], 'end': ['end', 'end', 'end', 'end'], } def get_col(self, c): if c.isspace(): return 0 if c == '+' or c == '-': return 1 if c.isdigit(): return 2 return 3 def get(self, c): self.state = self.table[self.state][self.get_col(c)] if self.state == 'in_number': self.ans = self.ans * 10 + int(c) self.ans = min(self.ans, INT_MAX) if self.sign == 1 else min(self.ans, -INT_MIN) elif self.state == 'signed': self.sign = 1 if c == '+' else -1 class Solution: def myAtoi(self, str: str) -> int: automaton = Automaton() for c in str: automaton.get(c) if automaton.state == "end": break return automaton.sign * automaton.ans