package hashing; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created by gouthamvidyapradhan on 25/02/2017. Given a string s and a non-empty string p, find all * the start indices of p's anagrams in s. * *

Strings consists of lowercase English letters only and the length of both strings s and p will * not be larger than 20,100. * *

The order of output does not matter. * *

Example 1: * *

Input: s: "cbaebabacd" p: "abc" * *

Output: [0, 6] * *

Explanation: The substring with start index = 0 is "cba", which is an anagram of "abc". The * substring with start index = 6 is "bac", which is an anagram of "abc". Example 2: * *

Input: s: "abab" p: "ab" * *

Output: [0, 1, 2] * *

Explanation: The substring with start index = 0 is "ab", which is an anagram of "ab". The * substring with start index = 1 is "ba", which is an anagram of "ab". The substring with start * index = 2 is "ab", which is an anagram of "ab". */ public class Anagrams { int[] TC = new int[256]; int[] PC = new int[256]; /** * Main method * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { List result = new Anagrams().findAnagrams("abab", "ab"); result.forEach(System.out::print); } public List findAnagrams(String s, String p) { List result = new ArrayList<>(); int pLen = p.length(); if (pLen > s.length()) return result; Arrays.fill(TC, 0); Arrays.fill(PC, 0); for (int i = 0; i < pLen; i++) { TC[s.charAt(i)]++; PC[p.charAt(i)]++; } int i = pLen; for (int l = s.length(); i < l; i++) { if (compare()) result.add(i - pLen); TC[s.charAt(i)]++; TC[s.charAt(i - pLen)]--; } if (compare()) result.add(i - pLen); return result; } private boolean compare() { for (int i = 0; i < 256; i++) { if (TC[i] != PC[i]) return false; } return true; } }