剑指 Offer 20. 表示数值的字符串【力扣】

该博客探讨如何通过设计状态机来判断一个字符串是否符合指定数值格式,指出状态机在解决此类复杂校验问题时的优越性,并提到了在LeetCode上的相关题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意理解

给定一个字符串,指定数值的格式规范,判断字符串是不是一个数值。

问题分析

用自动状态机,最难的是设计状态和状态变迁的过程,如下图。状态机的优点是清晰,方便修改。

 其他

力扣

状态机是解复杂校验的最佳方法,化烦为简,主观能动性的深刻体现。

链接

class Solution {
public:
    bool isNumber(string s) {
        enum STATUS_TYPE {
            START,
            ONE,
            TWO,
            THREE,
            FOUR,
            FIVE,
            SIX,
            SEVEN,
            EIGHT,
            NINE,
            TEN,
            EXCEPTION
        } ;
        enum INPUT_TYPE {
            BACKSPACE,
            SIGN,
            NUM,
            DOT,
            Ee,
            OTHER
        } ;
        STATUS_TYPE st = START;
        
        unordered_map<STATUS_TYPE, unordered_map<INPUT_TYPE, STATUS_TYPE>> my_dict{
            {
                START, {
                    {BACKSPACE, ONE},
                    {SIGN, TWO},
                    {NUM, THREE},
                    {DOT, FOUR}
                }
            },
            {
                ONE, {
                    {BACKSPACE, ONE},
                    {SIGN, TWO},
                    {NUM, THREE},
                    {DOT, FOUR}
                }
            },
            {
                TWO, {
                    {NUM, THREE},
                    {DOT, FOUR}
                }
            },
            {
                THREE, {
                    {BACKSPACE, TEN},
                    {DOT, FIVE},
                    {NUM, THREE},
                    {Ee, SEVEN}
                }
            },
            {
                FOUR, {
                    {NUM, SIX}
                }
            },
            {
                FIVE, {
                    {BACKSPACE, TEN},
                    {Ee, SEVEN},
                    {NUM, SIX}
                }
            },
            {
                SIX, {
                    {NUM, SIX},
                    {Ee, SEVEN},
                    {BACKSPACE, TEN}
                }
            },
            {
                SEVEN, {
                    {SIGN, EIGHT},
                    {NUM, NINE}
                }
            },
            {
                EIGHT, {
                    {NUM, NINE}
                }
            },
            {
                NINE, {
                    {NUM, NINE},
                    {BACKSPACE, TEN}
                }
            },
            {
                TEN, {
                    {BACKSPACE, TEN}
                }
            }

        };

        for (char ch : s) {
            INPUT_TYPE input;
            if (ch == ' ') {
                input = BACKSPACE;
            }
            else if (ch >= '0' && ch <= '9') {
                input = NUM;
            }
            else if (ch == '+' || ch == '-') {
                input = SIGN;
            }
            else if (ch == '.') {
                input = DOT;
            }
            else if (ch == 'E' || ch == 'e') {
                input = Ee;
            }
            else {
                input = OTHER;
            }
            if (my_dict[st].count(input)) {
                st = my_dict[st][input];
            }
            else {
                st = EXCEPTION;
                break;
            }
            cout << st << endl;
        }
        //cout << st << endl;
        if (st == THREE || st == FIVE || st == SIX || st == NINE || st == TEN) {
            return true;
        }
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值