#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param str string字符串 
# @return bool布尔型
#
class Solution:
    def isNumeric(self , str:str ):
        # write code here
        if not str:
            return False
        s = str.strip()
        if not s:
            return False
        length = len(s)
        # 四种状态
        is_dot = False
        is_num = False
        is_e_or_E = False
        # 逆向思维 满足那些状况返回False
        for i in range(length):
            # 有数字是正常的 设置为True
            if s[i] >= '0' and s[i] <= '9':
                is_num = True
            elif s[i] == '.':
                # 无重复小数点 无e
                # .123 可以转化为 0.123 是合法的
                # "123e1.12" 是非法的
                if is_dot or is_e_or_E:
                    return False
                is_dot = True
            elif s[i] == 'e' or s[i] == 'E':
                # 前面没有数字 前面有e
                if not is_num or is_e_or_E:
                    return False
                is_e_or_E = True
                # 重置数字 123e+ 遇到e后后面必须还要有数字
                is_num = False
            elif s[i] == '+' or s[i] == '-':
                # 符号不满足 第一个 and 只出现在e的后面 返回false
                if i != 0 and s[i-1] !='e' and s[i-1] != 'E':
                    return False
            else: # 遇到不是 数字 点 e/E +/- 直接返回False
                return False
        return is_num