【题目】
有效数字(按顺序)可以分成以下几个部分:
- 一个 小数 或者 整数
- (可选)一个
'e'
或'E'
,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符(
'+'
或'-'
)-
下述格式之一:
- 至少一位数字,后面跟着一个点
'.'
- 至少一位数字,后面跟着一个点
'.'
,后面再跟着至少一位数字 - 一个点
'.'
,后面跟着至少一位数字
- 至少一位数字,后面跟着一个点
整数(按顺序)可以分成以下几个部分:
- (可选)一个符号字符(
'+'
或'-'
) - 至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]
给你一个字符串 s
,如果 s
是一个 有效数字 ,请返回 true
。
示例 1:
输入: s = "0"
输出: true
示例 2:
输入: s = "e"
输出: false
示例 3:
输入: s = "."
输出: false
提示:
1 <= s.length <= 20
-
s
仅含英文字母(大写和小写),数字(0-9
),加号'+'
,减号'-'
,或者点'.'
。
【题目解析】
解题方法
使用正则表达式
为了精确地匹配所有有效数字的格式,我们采用正则表达式方法。正则表达式是一种强大的文本匹配工具,能够通过定义一系列的规则来识别复杂的文本模式。对于本题,我们设计一个正则表达式来匹配合法的数字格式,包括整数、小数和科学记数法。
算法步骤:
- 定义正则表达式规则:构造一个正则表达式来匹配可能出现的所有有效数字格式。
-
使用正则表达式匹配字符串:利用Python的
re
模块,使用定义好的正则表达式来检查输入字符串是否匹配。 -
返回匹配结果:如果字符串与正则表达式匹配,返回
True
表示字符串是一个有效数字;否则,返回False
。
class Solution:
def isNumber(self, s: str) -> bool:
# 定义正则表达式匹配有效数字
pattern = r'^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$'
return re.match(pattern, s) is not None
执行效率
image.png
【总结】
适用问题类型:
这种方法特别适用于需要精确定义输入格式并验证输入是否符合特定格式的问题,如验证邮箱地址、电话号码、身份证号码等,以及本例中的有效数字。
解决算法: 正则表达式
-
算法特点:
- 灵活性: 正则表达式能够灵活定义各种文本模式,适应复杂的文本格式要求。
- 强大的匹配能力: 能够在复杂的文本中快速识别和提取信息。
- 简洁性: 相较于传统的字符串处理方法,正则表达式提供了更为简洁和直观的解决方案。
-
时间复杂度与空间复杂度:
- 时间复杂度: 主要取决于正则表达式的复杂度和输入字符串的长度,一般为O(n),其中n为字符串长度。
- 空间复杂度: 由于正则匹配过程中需要存储状态信息,其空间复杂度也取决于正则表达式的复杂度和输入字符串的长度,但通常可以认为是O(1)或O(n)。
-
实践意义:
- 正则表达式提供了一种高效、灵活的方式来处理和验证格式化文本。在软件开发中,正确地使用正则表达式可以大大减少代码量,提高开发效率和代码的可维护性。
- 在处理用户输入验证、日志分析、文本数据清洗等多种场景下,正则表达式都是一个强有力的工具。
- 然而,正则表达式也存在一定的学习曲线,对于复杂的表达式,阅读和维护可能会比较困难,因此需要在复杂度和可维护性之间找到平衡。