<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:
bool c(string s){
    for(auto i:s){
        if(i>='a'&& i<='z' && i!='e'|| i>='A'&& i<='Z' && i!='E'){
            return 0;
        }
        i++;
    }
        return 1;
}
bool cbp(string s,int n){
    int i=0;
    while(i<n){
        if(s[i]=='e' || s[i]=='E' || s[i]=='-' || s[i]=='+'){
            return 0;
        }
        i++;
    }
    return 1;
}
bool cap(string s,int i){
    int n=s.size();
    while(i<n){
        if(s[i]=='-' || s[i]=='+'){
            return 0;
        }
        if(s[i]=='e'&&s[i]=='e'){
            break;
        }
        i++;
    }
    return 1;
}

bool cep(string s,int i){
    int n=s.size();
    if(s[i]=='-'||s[i]=='+'){
        s.erase(i,1);
    }
    // cout<<s[i];
    if(s[i]=='0' && i == n-1){
        return 1;
    }

    if(i==n){
        return 0;
    }
    n=s.size();
    while(i<n){
        if(s[i]=='-' || s[i]=='+' || s[i]=='.' ){
        return 0;
    }
    i++;
    }
    return 1;
}

    bool isNumber(string s) {
        int n=s.size();
        if(!c(s)){
            return 0;
        }
        if((s[0]=='+'||s[0]=='-')&& n==1){
            return 0;
        }
        if(s[0]=='+'||s[0]=='-'){
            s.erase(0,1);
        }
        if(s[0]=='+'||s[0]=='-'){
            return 0;
        }
        int f=0,d=0;
        int pe=-1,pd=-1;
        int i=0;
        n=s.size();   
        int j=0;
        while(j<n){
            if((s[j]=='-' || s[j]=='+') && j==n-1){
                return 0;
            }
            else if(s[j]=='+'||s[j]=='-'){
                if((s[j-1]>='0'&& s[j-1]<='9')&& (s[j+1]>='0'&&s[j+1]<='9')){
                    return 0;
                }
            }
            j++;
        } 
        while(i<n){
            if(s[i]=='E'||s[i]=='e'){
                f++;
                pe=i;
            }
            if(s[i]=='.'){
                d++;
                pd=i;
            }
            if(f==2||d==2){
                return 0;
            }
            i++;
        }
        if(pd==0 && n==1){
            return 0;
        }
        if(pd==0 && n>1 && (s[pd+1]<'0' || s[pd+1]>'9')){
            return 0;
        }
        if(pe==0 && n==1){
            return 0;
        }

        if(pd!=-1){
        if(!cbp(s,pd)){
            return 0;
        }
        if(!cap(s,pd+1)){
            return 0;
        }
        }
        if(pe!=-1){
        if(!cep(s,pe+1)){
            return 0;
        }
        if(pe==0 || s[pe-1]!='.'){
        if(pe==0 || s[pe-1]<'0' || s[pe-1]>'9'){
            // cout<<1;
            return 0;
        }
        }
        }
        if(i==n){
            return 1;
        }
        return 1;
    }
};
9200