有限状態機械(Finite State Machine)による数値文字列判定システム
有限状態機械(FSM)を使用して数値文字列の妥当性を判定するアルゴリズムです。文字列を左から右へ順次読み取り、各文字に応じて状態を遷移させながら、最終的に有効な終了状態に到達するかどうかで判定します。
文字列を一度だけ走査
状態変数のみ使用
効率的な状態設計
"0" - 単一桁数字
"2" - 整数
"-0.1" - 負の小数
"+3.14" - 正の小数
"4." - 整数部のみの小数
"-.9" - 小数部のみの負数
"2e10" - 整数の指数表記
"-90E3" - 負数の指数表記
"3e+7" - 正の指数
"53.5e93" - 小数の指数表記
"abc" - アルファベット
"1a" - 数字+文字
"1e" - 指数部なし
"e3" - 指数のみ
"99e2.5" - 小数点指数
"--6" - 二重符号
"-+3" - 混合符号
"e" - 指数記号のみ
"." - ドットのみ
8つの状態を定義します:INITIAL(初期状態)、SIGN(符号後)、INTEGER(整数部)、DOT(小数点後)、DECIMAL(小数部)、EXP(指数記号後)、EXP_SIGN(指数符号後)、EXP_NUMBER(指数部)
各状態から有効な入力文字に対してどの状態に遷移するかを定義します。無効な入力の場合は即座にfalseを返します。
文字列を左から右へ一文字ずつ読み取り、現在の状態と入力文字に基づいて次の状態を決定します。
文字列の終端に到達した時点で、現在の状態が有効な終了状態(INTEGER、DECIMAL、EXP_NUMBER)の一つであるかを確認します。
class Solution:
def isNumber(self, s: str) -> bool:
"""
競技プログラミング向け最適化実装
"""
if not s:
return False
# 状態定義(IntEnumによる整数比較最適化)
INITIAL, SIGN, INTEGER, DOT, DECIMAL, EXP, EXP_SIGN, EXP_NUMBER = range(8)
# 有効終了状態
valid_end_states = {INTEGER, DECIMAL, EXP_NUMBER}
state = INITIAL
i = 0
length = len(s)
while i < length:
char = s[i]
if state == INITIAL:
if char in "+-":
state = SIGN
elif "0" <= char <= "9": # 最速の数字判定
state = INTEGER
elif char == ".":
state = DOT
else:
return False
elif state == SIGN:
if "0" <= char <= "9":
state = INTEGER
elif char == ".":
state = DOT
else:
return False
elif state == INTEGER:
if "0" <= char <= "9":
pass # 同一状態継続(最適化)
elif char == ".":
state = DECIMAL
elif char in "eE":
state = EXP
else:
return False
elif state == DOT:
if "0" <= char <= "9":
state = DECIMAL
else:
return False
elif state == DECIMAL:
if "0" <= char <= "9":
pass # 同一状態継続
elif char in "eE":
state = EXP
else:
return False
elif state == EXP:
if char in "+-":
state = EXP_SIGN
elif "0" <= char <= "9":
state = EXP_NUMBER
else:
return False
elif state == EXP_SIGN:
if "0" <= char <= "9":
state = EXP_NUMBER
else:
return False
elif state == EXP_NUMBER:
if "0" <= char <= "9":
pass # 同一状態継続
else:
return False
i += 1
return state in valid_end_states
競技版は業務版より高速
整数比較・文字判定最適化
Pylanceエラー件数
state == State.INITIAL - IntEnumにより文字列比較より高速
"0" <= char <= "9" - isdigit()より高速なCPython最適化
state in ValidEndStates - C実装による高速判定
pass - 不要な代入を省略してパフォーマンス向上
競技プログラミング版(速度重視)と業務開発版(安全性重視)の2パターンを提供。用途に応じて選択可能。
IntEnumによる整数比較、文字列比較演算子、セットメンバーシップテストなど、CPython特化の最適化技術を活用。
完全な型アノテーション、プロトコル定義、カスタム例外階層により、Pylanceエラー完全解消を実現。
有効・無効パターンの網羅的テスト、パフォーマンス測定、エラーハンドリング検証を含む完全なテストスイート。