Permutation in String: 6 years later...

Wow, can't believe I've been trying to solve this problem for years, to be precise 6 years. Key is to not use a Hashtable (too expensive for this case) but rather a 26-len array. That brings the complexity to 26x10^4, totally doable. Code is down below, cheers, ACC.

Permutation in String - LeetCode

567. Permutation in String
Medium

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.

 

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.
Accepted
710,484
Submissions
1,608,202

public bool CheckInclusion(string s1, string s2)
{
    int[] c1 = new int[26];
    foreach (char c in s1)
        c1[(int)(c - 'a')]++;

    int[] c2 = new int[26];
    for (int i = 0; i < s2.Length; i++)
    {
        if (i < s1.Length)
            c2[(int)(s2[i] - 'a')]++;
        else
        {
            if (CompareInclusion(c1, c2)) return true;
            c2[(int)(s2[i] - 'a')]++;
            c2[(int)(s2[i - s1.Length] - 'a')]--;
        }
    }

    return CompareInclusion(c1, c2);
}

private bool CompareInclusion(int[] c1, int[] c2)
{
    for (int i = 0; i < c1.Length; i++)
        if (c1[i] != c2[i]) return false;
    return true;
}


Comments

Popular posts from this blog

Changing the root of a binary tree

ProjectEuler Problem 719 (some hints, but no spoilers)

The Power Sum, a recursive problem by HackerRank