Valid Number

hard string dfa

Problem

Decide if a given string is a valid number. A valid number is an optional sign, then an integer or decimal, optionally followed by an exponent (e/E) with an optional sign and an integer.

Inputs = "-90E3"
Outputtrue
"2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789" are all valid.

def is_number(s):
    seen_digit = seen_dot = seen_e = False
    digit_after_e = True
    for i, c in enumerate(s):
        if c.isdigit():
            seen_digit = True
            digit_after_e = True
        elif c in "+-":
            if i > 0 and s[i-1] not in "eE": return False
        elif c == ".":
            if seen_dot or seen_e: return False
            seen_dot = True
        elif c in "eE":
            if seen_e or not seen_digit: return False
            seen_e = True
            digit_after_e = False
        else:
            return False
    return seen_digit and digit_after_e
function isNumber(s) {
  let seenDigit = false, seenDot = false, seenE = false, digitAfterE = true;
  for (let i = 0; i < s.length; i++) {
    const c = s[i];
    if (c >= "0" && c <= "9") { seenDigit = true; digitAfterE = true; }
    else if (c === "+" || c === "-") {
      if (i > 0 && s[i - 1] !== "e" && s[i - 1] !== "E") return false;
    } else if (c === ".") {
      if (seenDot || seenE) return false;
      seenDot = true;
    } else if (c === "e" || c === "E") {
      if (seenE || !seenDigit) return false;
      seenE = true; digitAfterE = false;
    } else return false;
  }
  return seenDigit && digitAfterE;
}
class Solution {
    public boolean isNumber(String s) {
        boolean seenDigit = false, seenDot = false, seenE = false, digitAfterE = true;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) { seenDigit = true; digitAfterE = true; }
            else if (c == '+' || c == '-') {
                if (i > 0 && s.charAt(i - 1) != 'e' && s.charAt(i - 1) != 'E') return false;
            } else if (c == '.') {
                if (seenDot || seenE) return false;
                seenDot = true;
            } else if (c == 'e' || c == 'E') {
                if (seenE || !seenDigit) return false;
                seenE = true; digitAfterE = false;
            } else return false;
        }
        return seenDigit && digitAfterE;
    }
}
bool isNumber(string s) {
    bool seenDigit = false, seenDot = false, seenE = false, digitAfterE = true;
    for (int i = 0; i < (int)s.size(); i++) {
        char c = s[i];
        if (isdigit(c)) { seenDigit = true; digitAfterE = true; }
        else if (c == '+' || c == '-') {
            if (i > 0 && s[i - 1] != 'e' && s[i - 1] != 'E') return false;
        } else if (c == '.') {
            if (seenDot || seenE) return false;
            seenDot = true;
        } else if (c == 'e' || c == 'E') {
            if (seenE || !seenDigit) return false;
            seenE = true; digitAfterE = false;
        } else return false;
    }
    return seenDigit && digitAfterE;
}
Time: O(n) Space: O(1)