65. Valid Number

1. Description

Given a string s, return whether s is a valid number.
For example, all the following are valid numbers: “2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”, while the following are not valid numbers: “abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53”.
Formally, a valid number is defined using one of the following definitions:

  • An integer number followed by an optional exponent.
  • A decimal number followed by an optional exponent.

An integer number is defined with an optional sign ‘-’ or ‘+’ followed by digits.
A decimal number is defined with an optional sign ‘-’ or ‘+’ followed by one of the following definitions:

  • Digits followed by a dot ‘.’.
  • Digits followed by a dot ‘.’ followed by digits.
  • A dot ‘.’ followed by digits.

An exponent is defined with an exponent notation ‘e’ or ‘E’ followed by an integer number.
The digits are defined as one or more digits.

2. Example

Example 1:
Input: s = “0”
Output: true

Example 2:
Input: s = “e”
Output: false

Example 3:
Input: s = “.”
Output: false

3. Constraints

  • 1 <= s.length <= 20
  • s consists of only English letters (both uppercase and lowercase), digits (0-9), plus ‘+’, minus ‘-’, or dot ‘.’.

4. Solutions

n = str.size()
Time complexity : O(n)
Space complexity : O(1)


class Solution {
public:
    bool isNumber(const string &str) {
        bool has_digits = false, has_e = false, has_dot = false;
        for (int i = 0; i < str.size(); ++i) {
            switch (str[i]) {
            case '+':
            case '-':
                if (i > 0 && str[i - 1] != 'e' && str[i - 1] != 'E') {
                    return false;
                }
                has_digits = false;
                break;
            case '.':
                if (has_e || has_dot) {
                    return false;
                }
                has_dot = true;
                break;
            case 'e':
            case 'E':
                if (has_e || !has_digits) {
                    return false;
                }
                has_e = true;
                has_digits = false;
                break;
            default:
                if (!isdigit(str[i])) {
                    return false;
                }
                has_digits = true;
            }
        }

        return has_digits;
    }
};
Last updated:
Tags: String
comments powered by Disqus