public List<Integer> findAnagrams(String s, String p) {
if (s.length() < p.length()) {
return new ArrayList<Integer>();
}
char[] sArr = s.toCharArray();
char[] pArr = p.toCharArray();
int[] hash = new int[26];
for (int i = 0; i < pArr.length; ++i) {
hash[pArr[i] - 'a']++;
}
List<Integer> results = new ArrayList<>();
int l = 0, count = 0, pLength = p.length();
for (int r = 0; r < sArr.length; ++r) {
hash[sArr[r] - 'a']--;
if (hash[sArr[r] - 'a'] >= 0) {
count++;
}
if (r > pLength - 1) {
hash[sArr[l] - 'a']++;
if (hash[sArr[l] - 'a'] > 0) {
count--;
}
l++;
}
if (count == pLength) {
results.add(l);
}
}
return results;
}
public String minWindow(String s, String t) {
if (s.length() < t.length()) {
return "";
}
char[] sArr = s.toCharArray();
char[] tArr = t.toCharArray();
int[] hash = new int[256];
for (int i = 0; i < tArr.length; ++i) {
hash[tArr[i]]++;
}
int l = 0, count = tArr.length, max = s.length() + 1;
String result = "";
for (int r = 0; r < sArr.length; ++r) {
hash[sArr[r]]--;
if (hash[sArr[r]] >= 0) {
count--;
}
while (l < r && hash[sArr[l]] < 0) {
hash[sArr[l]]++;
l++;
}
if (count == 0 && max > r - l + 1) {
max = r - l + 1;
result = s.substring(l, r + 1);
}
}
return result;
}
public int lengthOfLongestSubstringTwoDistinct(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] sArr = s.toCharArray();
int[] hash = new int[256];
int l = 0, count = 0, result = 1;
for (int r = 0; r < sArr.length; ++r) {
hash[sArr[r]]++;
if (hash[sArr[r]] == 1) {
count++;
}
while (count > 2) {
hash[sArr[l]]--;
if (hash[sArr[l]] == 0) {
count--;
}
l++;
}
result = Math.max(result, r - l + 1);
}
return result;
}
public int lengthOfLongestSubstringKDistinct(String s, int k) {
if (s == null || s.length() == 0 || k == 0) {
return 0;
}
char[] sArr = s.toCharArray();
int[] hash = new int[256];
int l = 0, count = 0, result = 1;
for (int r = 0; r < sArr.length; ++r) {
hash[sArr[r]]++;
if (hash[sArr[r]] == 1) {
count++;
}
while (count > k) {
hash[sArr[l]]--;
if (hash[sArr[l]] == 0) {
count--;
}
l++;
}
result = Math.max(result, r - l + 1);
}
return result;
}
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] sArr = s.toCharArray();
int[] hash = new int[256];
int l = 0, result = 1;
for (int r = 0; r < sArr.length; ++r) {
hash[sArr[r]]++;
while (hash[sArr[r]] != 1) {
hash[sArr[l]]--;
l++;
}
result = Math.max(result, r - l + 1);
}
return result;
}
public boolean checkInclusion(String s1, String s2) {
if (s1.length() > s2.length()) {
return false;
}
char[] s1Arr = s1.toCharArray();
char[] s2Arr = s2.toCharArray();
int[] hash = new int[26];
for (int i = 0; i < s1Arr.length; ++i) {
hash[s1Arr[i] - 'a']++;
}
int l = 0, count = 0;
for (int r = 0; r < s2Arr.length; ++r) {
hash[s2Arr[r] - 'a']--;
if (hash[s2Arr[r] - 'a'] >= 0) {
count++;
}
if (r >= s1Arr.length) {
hash[s2Arr[l] - 'a']++;
if (hash[s2Arr[l] - 'a'] >= 1) {
count--;
}
l++;
}
if (count == s1Arr.length) {
return true;
}
}
return false;
}
public int subarraysWithKDistinct(int[] A, int K) {
if (A == null || A.length < K) {
return 0;
}
int[] hash = new int[A.length + 1];
int l = 0, results = 0, count = 0, result = 1;
for (int r = 0; r < A.length; ++r) {
hash[A[r]]++;
if (hash[A[r]] == 1) {
count++;
}
while (hash[A[l]] > 1 || count > K) {
if (count > K) {
result = 1;
count--;
} else {
result++;
}
hash[A[l]]--;
l++;
}
if (count == K) {
results += result;
}
}
return results;
}
public int characterReplacement(String s, int k) {
if (s == null || s.length() == 0) {
return 0;
}
char[] sArr = s.toCharArray();
int[] hash = new int[26];
int l = 0, maxCount = 0, result = 0;
for (int r = 0; r < sArr.length; ++r) {
hash[sArr[r] - 'A']++;
maxCount = Math.max(maxCount, hash[sArr[r] - 'A']);
while (r - l + 1 - maxCount > k) {
hash[sArr[l] - 'A']--;
l++;
}
result = Math.max(r - l + 1, result);
}
return result;
}
public double[] medianSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length < k ) {
return new double[0];
}
double[] results = new double[nums.length - k + 1];
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for (int i = 0; i < nums.length; ++i) {
// add current element into queue
maxHeap.offer(nums[i]);
minHeap.offer(maxHeap.poll());
if (minHeap.size() > maxHeap.size()) {
maxHeap.offer(minHeap.poll());
}
// record answer
if (i >= k - 1) {
results[i - k + 1] = minHeap.size() < maxHeap.size()
? maxHeap.peek() : ((long)maxHeap.peek() + minHeap.peek()) * 0.5;
if (maxHeap.contains(nums[i - k + 1])) {
maxHeap.remove(nums[i - k + 1]);
} else {
minHeap.remove(nums[i - k + 1]);
}
}
}
return results;
}