# Leetcode Permutation-In-String #### 2022-07-14 10:29 > ##### Algorithms: > #algorithm #sliding_window > ##### Data structures: > #DS #string > ##### Difficulty: > #coding_problem #difficulty-medium > ##### Additional tags: > #leetcode #CS_list_need_understanding > ##### Revisions: > N/A ##### Related topics: ```expander tag:#sliding_window ``` ##### Links: - [Link to problem](https://leetcode.com/problems/permutation-in-string/) ___ ### Problem Given two strings `s1` and `s2`, return `true` _if_ `s2` _contains a permutation of_ `s1`_, or_ `false` _otherwise_. In other words, return `true` if one of `s1`'s permutations is the substring of `s2`. #### Examples **Example 1:** **Input:** s1 = "ab", s2 = "eidbaooo" **Output:** true **Explanation:** s2 contains one permutation of s1 ("ba"). **Example 2:** **Input:** s1 = "ab", s2 = "eidboaoo" **Output:** false #### Constraints - `1 <= s1.length, s2.length <= 104` - `s1` and `s2` consist of lowercase English letters. ### Thoughts > [!summary] > This is a #sliding_window problem. I tried to use kadane's algorithm, but the problem is a premature string, not set. So I gave up. Then I found out this is sliding window problem, similar to [[Leetcode Longest-Substring-Without-Repeating-Characters]] ### Solution ```cpp class Solution { public: bool checkInclusion(string s1, string s2) { // Sliding windows problem. // First, register the freqs of s1 vector freq(26, 0); for (char ch : s1) { freq[ch - 'a']++; } // Second, start constructing window and window freq; int len = s1.length(); int l = 0, r = 0; vector window(26, 0); // Start expanding and sliding! while (r < s2.length()) { // I add value to window here, to avoid r OOB when r = s2.length window[s2[r] - 'a']++; if (r - l + 1 < len) { // Expand right r++; } else if (window == freq) { // note that I use else if, to make sure // every time r is incremented once. return true; } else { // Remove l from the window, slide right window[s2[l] - 'a']--; l++; r++; } } return false; } }; ```