数据结构与算法之 leetcode 栈有效数字验证算法 有限状态自动机

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


摘要:

本文将围绕LeetCode上的栈有效数字验证算法问题,深入探讨其背后的数据结构与算法原理。通过分析问题,我们将采用有限状态自动机(Finite State Automaton,FSA)的方法来实现一个高效的栈有效数字验证算法。文章将涵盖算法原理、状态转移、代码实现以及性能分析等方面。

一、

LeetCode是一个在线编程社区,提供大量的编程题目,旨在帮助程序员提高编程技能。栈有效数字验证算法是LeetCode上的一道经典题目,要求判断一个字符串是否可以表示一个有效的数字。本文将结合有限状态自动机的方法,对这一问题进行深入解析和实现。

二、问题分析

栈有效数字验证算法要求判断一个字符串是否可以表示一个有效的数字。有效数字包括整数、小数以及负数。以下是一些示例:

- "0" 是一个有效数字

- " 0.1 " 是一个有效数字

- "abc" 不是一个有效数字

- "1 a" 不是一个有效数字

三、算法原理

有限状态自动机是一种理论模型,用于识别字符串的模式。在栈有效数字验证算法中,我们可以使用有限状态自动机来模拟数字的构成过程。以下是算法的基本原理:

1. 定义状态:根据数字的构成,我们可以定义以下状态:

- INITIAL:初始状态

- SIGN:符号状态(正号或负号)

- INTEGER:整数部分状态

- DECIMAL:小数部分状态

- END:结束状态

2. 状态转移:根据输入的字符,从当前状态转移到下一个状态。以下是状态转移规则:

- 从 INITIAL 状态:

- 如果输入的是数字,转移到 INTEGER 状态

- 如果输入的是 '+' 或 '-',转移到 SIGN 状态

- 从 SIGN 状态:

- 如果输入的是数字,转移到 INTEGER 状态

- 从 INTEGER 状态:

- 如果输入的是 '.',转移到 DECIMAL 状态

- 如果输入的是数字,继续在 INTEGER 状态

- 从 DECIMAL 状态:

- 如果输入的是数字,继续在 DECIMAL 状态

- 从 END 状态:保持不变

3. 判断有效数字:当输入的字符串遍历完成后,如果当前状态是 END 状态,则表示字符串是一个有效数字。

四、代码实现

以下是基于有限状态自动机的栈有效数字验证算法的Python实现:

python

class Solution:


def isNumber(self, s: str) -> bool:


states = {


'INITIAL': [0, 1, 2],


'SIGN': [1],


'INTEGER': [1, 2, 3],


'DECIMAL': [3],


'END': [4]


}


p = 0


for c in s:


if c.isdigit():


p = 1


elif c == '.':


p = 2


elif c == '+':


p = 3


elif c == '-':


p = 4


else:


p = -1


if p not in states['INITIAL']:


return False


return p in states['END']

测试代码


solution = Solution()


print(solution.isNumber("0")) True


print(solution.isNumber(" 0.1 ")) True


print(solution.isNumber("abc")) False


print(solution.isNumber("1 a")) False


五、性能分析

该算法的时间复杂度为O(n),其中n为输入字符串的长度。空间复杂度为O(1),因为算法中只使用了有限的变量。

六、总结

本文通过分析LeetCode上的栈有效数字验证算法问题,介绍了基于有限状态自动机的解决方案。通过定义状态、状态转移以及判断有效数字,我们实现了一个高效的栈有效数字验证算法。在实际应用中,有限状态自动机可以用于解决各种模式识别问题,具有广泛的应用前景。