我的方法是遍历一遍整个字符串,然后看一看是否合法。具体的规则看代码。看题解的时候发现有的人用了自动机的方法,觉得很巧妙,可以当作一种解题思路。不过我觉得自动机的方法用在这种题上有些杀鸡用牛刀了,这道题用直接写规则的方法就可以以O(n)的复杂度求解,用自动机的方法也是O(n)的复杂度,而且还需要很多额外的思考时间。所以我觉得有些大材小用了。
class Solution:
def isNumber(self, s: str) -> bool:
s = s.strip() # 去除首尾空格
flag1 = False # have a preceding number
flag2 = False # have a preceding e
flag3 = False # have a preceding sign
flag4 = False # have a preceding .
for i in range(len(s)):
# print(flag1, flag2, flag3, flag4)
if s[i] >= '0' and s[i] <= '9':
flag1 = True
elif s[i] == 'e':
if flag2 or not flag1: # if we have a preceding e or dont have any preceding numbers, the string is illegal
return False
flag1 = False # there can be a new number after e
flag3 = False
flag4 = False
flag2 = True
elif s[i] == '+' or s[i] == '-':
if flag1 or flag3 or flag4:
return False
flag3 = True
elif s[i] == '.':
if flag2 or flag4:
return False
flag4 = True
else:
return False # illegal characters
if not flag1:
return False
return True