<p>Given two strings <code>s1</code> and <code>s2</code>, return <code>true</code><em> if </em><code>s2</code><em> contains a permutation of </em><code>s1</code><em>, or </em><code>false</code><em> otherwise</em>.</p>

<p>In other words, return <code>true</code> if one of <code>s1</code>&#39;s permutations is the substring of <code>s2</code>.</p>

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

<pre>
<strong>Input:</strong> s1 = &quot;ab&quot;, s2 = &quot;eidbaooo&quot;
<strong>Output:</strong> true
<strong>Explanation:</strong> s2 contains one permutation of s1 (&quot;ba&quot;).
</pre>

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

<pre>
<strong>Input:</strong> s1 = &quot;ab&quot;, s2 = &quot;eidboaoo&quot;
<strong>Output:</strong> false
</pre>

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

<ul>
	<li><code>1 &lt;= s1.length, s2.length &lt;= 10<sup>4</sup></code></li>
	<li><code>s1</code> and <code>s2</code> consist of lowercase English letters.</li>
</ul>

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        
        int n1 = s1.size();
        int n2 = s2.size();
        if(n1>n2) return false;

        //hashing the characters of the string : s1
        
        vector<int> hashArray(256,0);

        for(int i = 0; i<n1; i++){
            hashArray[s1[i]]++;
        }   

        //now we have successfully hashed all the characters of s1
        //now, we'll slide a window of size same as the size of the string : s1
        //over the string s2. we'll check that whether or not the frequency of 
        //all the characters appearing in the sliding window is > 1 (from the hasharray)
        
        //if the frequency of all the characters lying inside the sliding window is > 1
        //in the string : s1, then it means that the characters lying in side the sliding 
        //window make up a permutation of the string : s1. Hence, we'll return true in this case

        //traverse s2 string in a window of size = s1.size();

        int windowSize = n1;
        int j = 0;
        while(j+windowSize-1 < n2){
            
            //ctr to see how many out of the characters present in the window are present in the 
            //string : s1
            int ctr = 0;

            //creating a copy of the hasharray
            vector<int> copyHash;
            copyHash = hashArray;
            //iterating in all the elements present in the window and checking for their frequency
            for(int k = j; k<= j+windowSize-1; k++){
                if(copyHash[s2[k]] > 0) ctr++;
                copyHash[s2[k]]--;
            }

            //if all the elements inside the window in s2 are present in s1, 
            //that means that a permutation of the string s1 is present in s2
            if(ctr == windowSize) return true;
            j++;
        }

        return false;    
            
    }    
};
88628