public bool CheckInclusion(string s1, string s2)
{
int m = s1.Length, n = s2.Length;
if (m > n)
{
return false;
}
int[] cnt = new int[26];
foreach (char c in s1)
{
cnt[c - 'a']++;
}
int[] cur = new int[26];
char[] s2Array = s2.ToCharArray();
for (int i = 0; i < m; i++)
{
cur[s2Array[i] - 'a']++;
}
if (Check(cnt, cur))
{
return true;
}
for (int i = m; i < n; i++)
{
cur[s2Array[i] - 'a']++;
cur[s2Array[i - m] - 'a']--;
if (Check(cnt, cur))
{
return true;
}
}
return false;
}
public bool Check(int[] cnt1, int[] cnt2)
{
for (int i = 0; i < 26; i++)
{
if (cnt1[i] != cnt2[i])
{
return false;
}
}
return true;
}
public int LengthOfLongestSubstring(string s)
{
ISet<char> set = new HashSet<char>();
int maxLength = 0;
int start = 0, end = 0;
int length = s.Length;
while (end < length)
{
char c = s[end];
while (start < end && set.Contains(c))
{
set.Remove(s[start]);
start++;
}
set.Add(c);
maxLength = Math.Max(maxLength, end - start + 1);
end++;
}
return maxLength;
}