LeetCode | Valid Number

题目:

Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

思路:

基本思路是类似词法分析器一样,一次读取每个字符并写入一个栈中。最后将栈中的结果与指定的语法匹配,若匹配正确则返回成功;否则返回失败。为了简单起见,我们用如下字符表示字符集:

F表示符号

N表示数字

.表示小数点

E表示10进制符号

_表示空格

代码:

class Solution {
public:
    bool isNumber(const char *s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int len = 0;
        int data[10];
        
        for(int i = 0; i < 10; i++)
        {
            data[i] = 'O';
        }
        
        for(int i = 0; s[i] != '\0'; i++)
        {
            if(len == 0 && s[i] ==' ')
            {
                continue;
            }
            else if(s[i] == '+' || s[i] == '-')
            {
                data[len++] = 'F';
            }
            else if(len == 0 && s[i] >= '0' && s[i] <= '9')
            {
                data[len++] = 'N';
            }
            else if(len == 0 && s[i] == '.')
            {
                data[len++] = '.';
            }
            else if(len > 0 &&  s[i] >= '0' && s[i] <= '9')
            {
                if(data[len - 1] == 'N')
                {
                    continue;
                }
                else if(data[len - 1] == ' ')
                {
                    return false;
                }
                else
                {
                    data[len++] = 'N';
                }
            }
            else if(len > 0 &&  (s[i] == 'E' || s[i] == 'e'))
            {
                data[len++] = 'E';
            }
            else if(len > 0 &&  s[i] == '.')
            {
                data[len++] = '.';
            }
            else if(len > 0 && s[i] ==' ')
            {
                if(data[len - 1] == ' ')
                {
                    continue;
                }
                else
                {
                    data[len++] = ' ';
                }
            }
            else
            {
                return false;
            }
        }
        
        if(data[len-1] == ' ')
        {
            len--;
        }
        
        vector<string> pattern;
        pattern.push_back("N");
        pattern.push_back("FN");
        pattern.push_back("N.N");
        pattern.push_back("FN.N");
        pattern.push_back(".N");
        pattern.push_back("F.N");
        pattern.push_back("NEN");
        pattern.push_back("FNEN");
        pattern.push_back("NEFN");
        pattern.push_back("FNEFN");
        pattern.push_back("N.");
        pattern.push_back("FN.");
        pattern.push_back("N.NEN");
        pattern.push_back("FN.NEN");
        pattern.push_back("N.NEFN");
        pattern.push_back("FN.NEFN");
        pattern.push_back("N.EN");
        pattern.push_back("FN.EN");
        pattern.push_back("N.EFN");
        pattern.push_back("FN.EFN");
        pattern.push_back(".NEN");
        pattern.push_back("F.NEN");
        pattern.push_back(".NEFN");
        pattern.push_back("F.NEFN");
   
        for(int i = 0; i < pattern.size(); i++)
        {
            if(len == pattern[i].size())
            {
                bool match = true;
                
                for(int j = 0; j < len; j++)
                {
                    if(pattern[i][j] != data[j])
                    {
                        match = false;
                        break;
                    }
                }
                if(match)
                    return true;
            }
        }
        return false;
    }
};

    原文作者:Allanxl
    原文地址: https://blog.csdn.net/lanxu_yy/article/details/11696611
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞