<p>Given a string <code>queryIP</code>, return <code>&quot;IPv4&quot;</code> if IP is a valid IPv4 address, <code>&quot;IPv6&quot;</code> if IP is a valid IPv6 address or <code>&quot;Neither&quot;</code> if IP is not a correct IP of any type.</p>

<p><strong>A valid IPv4</strong> address is an IP in the form <code>&quot;x<sub>1</sub>.x<sub>2</sub>.x<sub>3</sub>.x<sub>4</sub>&quot;</code> where <code>0 &lt;= x<sub>i</sub> &lt;= 255</code> and <code>x<sub>i</sub></code> <strong>cannot contain</strong> leading zeros. For example, <code>&quot;192.168.1.1&quot;</code> and <code>&quot;192.168.1.0&quot;</code> are valid IPv4 addresses while <code>&quot;192.168.01.1&quot;</code>, <code>&quot;192.168.1.00&quot;</code>, and <code>&quot;192.168@1.1&quot;</code> are invalid IPv4 addresses.</p>

<p><strong>A valid IPv6</strong> address is an IP in the form <code>&quot;x<sub>1</sub>:x<sub>2</sub>:x<sub>3</sub>:x<sub>4</sub>:x<sub>5</sub>:x<sub>6</sub>:x<sub>7</sub>:x<sub>8</sub>&quot;</code> where:</p>

<ul>
	<li><code>1 &lt;= x<sub>i</sub>.length &lt;= 4</code></li>
	<li><code>x<sub>i</sub></code> is a <strong>hexadecimal string</strong> which may contain digits, lowercase English letter (<code>&#39;a&#39;</code> to <code>&#39;f&#39;</code>) and upper-case English letters (<code>&#39;A&#39;</code> to <code>&#39;F&#39;</code>).</li>
	<li>Leading zeros are allowed in <code>x<sub>i</sub></code>.</li>
</ul>

<p>For example, &quot;<code>2001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;</code> and &quot;<code>2001:db8:85a3:0:0:8A2E:0370:7334&quot;</code> are valid IPv6 addresses, while &quot;<code>2001:0db8:85a3::8A2E:037j:7334&quot;</code> and &quot;<code>02001:0db8:85a3:0000:0000:8a2e:0370:7334&quot;</code> are invalid IPv6 addresses.</p>

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

<pre>
<strong>Input:</strong> queryIP = &quot;172.16.254.1&quot;
<strong>Output:</strong> &quot;IPv4&quot;
<strong>Explanation:</strong> This is a valid IPv4 address, return &quot;IPv4&quot;.
</pre>

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

<pre>
<strong>Input:</strong> queryIP = &quot;2001:0db8:85a3:0:0:8A2E:0370:7334&quot;
<strong>Output:</strong> &quot;IPv6&quot;
<strong>Explanation:</strong> This is a valid IPv6 address, return &quot;IPv6&quot;.
</pre>

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

<pre>
<strong>Input:</strong> queryIP = &quot;256.256.256.256&quot;
<strong>Output:</strong> &quot;Neither&quot;
<strong>Explanation:</strong> This is neither a IPv4 address nor a IPv6 address.
</pre>

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

<ul>
	<li><code>queryIP</code> consists only of English letters, digits and the characters <code>&#39;.&#39;</code> and <code>&#39;:&#39;</code>.</li>
</ul>

class Solution {
public:
    string validIPAddress(string str) 
    {
        if(check_ipv4(str)==true)
       {
           return "IPv4";	
       }        
       else if(check_ipv6(str)==true)
       {
          return "IPv6";
       }
       return "Neither";
    }
    bool check_ipv4(string s) 
    {
        int idx=0;
       // bool flag=true;     //considering the ip address to be valid initially

        int count=0;

        string temp="";

        while(true)
        {
            if(s[idx]=='.')
            {
                if(temp.length()>3) return false;
                
                if(temp.length()==0)
                return false;

                int num=stoi(temp);
                //checking for the leading zeros
                if(num>0 and temp.length()>0 and temp[0]=='0')
                return false;
                else if(num==0 and temp.length()>1 and temp[0]=='0')
                return false;


                if(num>=0 and num<=255)
                {
                    count++;
                    temp="";
                }
                else
                {
                    return false;
                }
                //code
            }
            else if(idx>=s.length())
            {
                if(temp.length()>3) return false;
                
                if(temp.length()==0)
                return false;
                //code
                int num=stoi(temp);


                if(num>0 and temp.length()>0 and temp[0]=='0')
                return false;
                else if(num==0 and temp.length()>1 and temp[0]=='0')
                return false;
                
                if(num>=0 and num<=255)
                {
                    count++;
                    temp="";
                }
                else
                {
                    return false;
                }
                break;
            }
            else if(s[idx]>='0' and s[idx]<='9')
            {
               temp=temp+s[idx];
            }
            else
		    {
                return false;
            }
            idx++;
        }
        if(count==4) return true;
        return false;
   }
    bool check_ipv6(string str)
   {
        int idx=0;
        int count=0;    //count-->8
        string temp="";
        while(true)
        {
            if(str[idx]==':')
            {
                //just need to check the empty string
                if(temp.length()==0)
                return false;
                if(temp.length()>4)
                return false;
                
                count++;
                temp="";
                idx++;	
            }
            else if(idx>=str.length())
            {
                //code
                if(temp.length()==0)
                return false;
                if(temp.length()>4)
                return false;
                
                count++;
                temp="";
                idx++;	

                break;
            }
            else if((str[idx]>='0' and str[idx]<='9') or (str[idx]>='a' and str[idx]<='f') or (str[idx]>='A' and str[idx]<='F'))
            {
                temp=temp+str[idx];
                idx++;
            }
            else
            {
                return false;
            }
        }
        if(count==8)
        return true;
        
        return false;
   }
};
11900