<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) {
        map<char, int> m = map<char, int>(); 
        // set<char> s = set<char>();
        for(char c : s1) {
            if(m.count(c) > 0) m[c]++; 
            else m[c] = 1; 
            // s.insert(c);
        }

        int i = 0; 
        int j = 0; 
        while(j <= s2.size()) {
            j++; 
            cout << i << ' ' << j << endl; 
            if(m.count(s2[j - 1]) == 0) {
                cout << "here" << endl; 
                m[s2[j - 1]] = -1;
                while(i <= j) {
                    cout << s2[i] << endl; 
                    i++; 
                    if(m.count(s2[i - 1]) != 0) {
                        m[s2[i - 1]]++; 
                        if(m[s2[i - 1]] == 0) {
                            m.erase(s2[i - 1]);
                            break; 
                        }
                    }
                    else m[s2[i - 1]] = 1; 
                }
            } 
            else {
                m[s2[j - 1]]--; 
                if(m[s2[j - 1]] == 0)m.erase(s2[j - 1]);
                if(m.empty()) return true; 
            }
            cout << i << ' ' << j << endl; 
            cout << s2[j - 1] << ' ' << m.size() << endl; 
        }
        return false; 
    } 
};
14096