首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode Valid Number:正則表達式驗證數字字符串

     編輯:C++ 入門

問題描述

判斷給定字符串是否為合法數字。合法示例:"0", " 0.1 ", "2e10";非法:"abc", "1 a"。允許前後空格、符號、小數點、科學計數法 (e/E)。

正則表達式解法

Java 正則:


public boolean isNumber(String s) {
    String regex = "[+-]?(\\d+\\.?|\\.\\d+)\\d*(e[+-]?\\d+)?";
    return s.trim().matches(regex);
}

正則詳解

  • [+-]?:可選符號。
  • (\\d+\\.?|\\.\\d+):整數部分可帶小數點(如 123.),或純小數(如 .123)。
  • \\d*:小數點後的數字(可為空)。
  • (e[+-]?\\d+)?:可選科學計數部分,e 後必須有整數(可帶符號)。

手寫狀態機解法 (C++)


bool isNumber(string s) {
    int i = 0, n = s.size();
    while (i < n && isspace(s[i])) ++i;
    while (n > i && isspace(s[n-1])) --n;
    if (i >= n) return false;
    bool num = false, dot = false, e = false;
    for (; i < n; ++i) {
        char c = s[i];
        if (isdigit(c)) num = true;
        else if (c == '+' || c == '-') {
            if (i != 0 && s[i-1] != 'e' && s[i-1] != 'E') return false;
        } else if (c == '.') {
            if (dot || e) return false; dot = true;
        } else if (c == 'e' || c == 'E') {
            if (e || !num) return false; e = true; num = false; // e 後必須有數字
        } else return false;
    }
    return num;
}

關鍵狀態規則

  1. 符號只能出現在開頭或 e/E 之後。
  2. 小數點只能出現一次,且不能在 e/E 之後。
  3. e/E 只能出現一次,前面必須有數字,後面必須有數字(可帶符號)。
  4. 至少有一個數字(整體或 e 後)。

複雜度

  • 時間:O(L),L 為字符串長度。
  • 空間:O(1)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved