Skip to main content
Back to problems
#65
Hard Algorithms

Valid number

String
22.6% acceptance
Jan 12, 2026
1489
2208
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.

Solution

Rust
Time O(n)
Space O(1)
LeetCode
solution.rs
impl Solution {
  pub fn is_number(s: String) -> bool {
    let s = s.trim();
    let chars: Vec<char> = s.chars().collect();
    let mut i = 0;
    let n = chars.len();
    
    if n == 0 {
      return false;
    }
    
    // Check optional sign
    if i < n && (chars[i] == '+' || chars[i] == '-') {
      i += 1;
    }
    
    let mut has_digits = false;
    let mut has_dot = false;
    
    // Parse number part (integer or decimal)
    while i < n {
      if chars[i].is_ascii_digit() {
        has_digits = true;
        i += 1;
      } else if chars[i] == '.' {
        if has_dot {
          return false; // Multiple dots
        }
        has_dot = true;
        i += 1;
      } else {
        break;
      }
    }
    
    if !has_digits {
      return false;
    }
    
    // Check for exponent
    if i < n && (chars[i] == 'e' || chars[i] == 'E') {
      i += 1;
      
      // Check optional sign after exponent
      if i < n && (chars[i] == '+' || chars[i] == '-') {
        i += 1;
      }
      
      // Must have digits after exponent
      let exp_start = i;
      while i < n && chars[i].is_ascii_digit() {
        i += 1;
      }
      
      if i == exp_start {
        return false; // No digits after exponent
      }
    }
    
    i == n
  }
}