<p>Given a string <code>s</code>, return whether <code>s</code> is a <strong>valid number</strong>.<br />
<br />
For example, all the following are valid numbers: <code>&quot;2&quot;, &quot;0089&quot;, &quot;-0.1&quot;, &quot;+3.14&quot;, &quot;4.&quot;, &quot;-.9&quot;, &quot;2e10&quot;, &quot;-90E3&quot;, &quot;3e+7&quot;, &quot;+6e-1&quot;, &quot;53.5e93&quot;, &quot;-123.456e789&quot;</code>, while the following are not valid numbers: <code>&quot;abc&quot;, &quot;1a&quot;, &quot;1e&quot;, &quot;e3&quot;, &quot;99e2.5&quot;, &quot;--6&quot;, &quot;-+3&quot;, &quot;95a54e53&quot;</code>.</p>

<p>Formally, a&nbsp;<strong>valid number</strong> is defined using one of the following definitions:</p>

<ol>
	<li>An <strong>integer number</strong> followed by an <strong>optional exponent</strong>.</li>
	<li>A <strong>decimal number</strong> followed by an <strong>optional exponent</strong>.</li>
</ol>

<p>An <strong>integer number</strong> is defined with an <strong>optional sign</strong> <code>&#39;-&#39;</code> or <code>&#39;+&#39;</code> followed by <strong>digits</strong>.</p>

<p>A <strong>decimal number</strong> is defined with an <strong>optional sign</strong> <code>&#39;-&#39;</code> or <code>&#39;+&#39;</code> followed by one of the following definitions:</p>

<ol>
	<li><strong>Digits</strong> followed by a <strong>dot</strong> <code>&#39;.&#39;</code>.</li>
	<li><strong>Digits</strong> followed by a <strong>dot</strong> <code>&#39;.&#39;</code> followed by <strong>digits</strong>.</li>
	<li>A <strong>dot</strong> <code>&#39;.&#39;</code> followed by <strong>digits</strong>.</li>
</ol>

<p>An <strong>exponent</strong> is defined with an <strong>exponent notation</strong> <code>&#39;e&#39;</code> or <code>&#39;E&#39;</code> followed by an <strong>integer number</strong>.</p>

<p>The <strong>digits</strong> are defined as one or more digits.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;0&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">true</span></p>
</div>

<p><strong class="example">Example 2:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;e&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">false</span></p>
</div>

<p><strong class="example">Example 3:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">s = &quot;.&quot;</span></p>

<p><strong>Output:</strong> <span class="example-io">false</span></p>
</div>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 20</code></li>
	<li><code>s</code> consists of only English letters (both uppercase and lowercase), digits (<code>0-9</code>), plus <code>&#39;+&#39;</code>, minus <code>&#39;-&#39;</code>, or dot <code>&#39;.&#39;</code>.</li>
</ul>

class Solution {
public:
 /*
        1. Check whitespace
        2. Check Sign characters
        3. Check if its expoential 
            - Check presence of 'e' or 'E'
            - Check presence of dot '.'
        4. Check if there is any digit
        5. check if we have any char other than 'e' /'E'
 */
    bool isInteger(string str)
    {
        std::cout<<"Is Integer = "<<str<<std::endl;
        if(str.empty())
        return false;

        int i =0;
        if(str[i] == '+' || str[i] == '-')
        i++;

        if(i >= str.size())
        return false ;  //You cannot have just sign

        for(i;i<str.size();i++)
        {
            if(!isdigit(str[i]))
            return false;
        }

        return true;
    }

    bool isDecimal(string str)
    {
        std::cout<<"Is Decimal = "<<str<<std::endl;
        if(str.empty())
        return false;

        int i =0;

        if(str[i] == '-' || str[i] == '+')
        i++;
        if(i >= str.size())
        return false ;  //You cannot have just sign

        bool hasDigitsBefore = false, hasDigitsAfter = false, hasDot = false;

        for(i;i<str.size();i++)
        {
            if(str[i] == '.')
            {
                if(hasDot)
                return false;

                hasDot = true;
            }
            else if(!isdigit(str[i]))
            return false;
            else
            {
                if(hasDot)
                hasDigitsAfter = true;
                else
                hasDigitsBefore = true;
            }
        }
        return hasDigitsAfter || hasDigitsBefore;
    }

    bool isNumber(string s) {
        int start =0;
        int end = s.size() -1;

        //Whitespace Check
        while(isspace(s[start]) && start < s.size())
        start++;

         while(isspace(s[end]) && end>=0)
         end--;

        if(start > end)
        return false;

        //Exponent Check
        bool hasExponent = false;
        string base = "",expoPart ="";

        for(int i=start;i<=end;i++)
        {
             

            if(s[i] == 'e' || s[i]== 'E')
            {

            if(hasExponent)   //This means its second occurance of 'e'/'E'
            return false; 
            hasExponent = true;  

            base = s.substr(start,i-start);
            expoPart = s.substr(i+1,end-i);

            if (expoPart.empty())
             return false;  // Invalid if there's nothing after 'e'

            }
            
              
        }
        //Exponent Check over, Now Integer and Decimal Check

        if(!hasExponent)
        {
            base = s.substr(start,end-start+1) ;  //Full string is base now
        }
    std::cout<<"base = "<<base<<" Expo = "<<expoPart<<std::endl;
        bool isValidBase = isInteger(base) || isDecimal(base);
        bool isValidExpo = expoPart.empty() || isInteger(expoPart);

        return isValidBase && isValidExpo;
        
    }
};
10000