Chaturmind
LearnDSASystem DesignBlogPremium
Sign inGet started
Chaturmind

Structured learning paths for engineers who want to go deep. Written by practitioners.

Learn

  • Java
  • DSA
  • System Design
  • Spring Boot
  • AI / ML

Company

  • Blog
  • Premium
  • Contact

Legal

  • Privacy Policy
  • Terms of Service

© 2026 Chaturmind. All rights reserved.

Built for engineers who want to go deep.


← Arrays & Strings Mastery

Core Patterns

  • Two Pointers Pattern
  • Sliding Window Pattern
  • Prefix Sums

String Problems

  • String Hashing & Anagrams
  • String Two-Pointer Problems
Chaturmind
← Arrays & Strings Mastery

Core Patterns

  • Two Pointers Pattern
  • Sliding Window Pattern
  • Prefix Sums

String Problems

  • String Hashing & Anagrams
  • String Two-Pointer Problems
HomeLearnDSAArrays & Strings MasteryString Patterns
✓ FreeIntermediate· 11 min read

String Hashing and Anagrams

Use character frequency maps and sorting to solve anagram, permutation, and grouping problems.

Published March 7, 2025


String Hashing and Anagrams

Anagram problems rely on the insight that two strings are anagrams if they have identical character frequency distributions. The two main approaches: sorting and frequency counting.

Approach 1: Sort Both Strings

public boolean isAnagram(String s, String t) {
    if (s.length() != t.length()) return false;
    char[] sc = s.toCharArray();
    char[] tc = t.toCharArray();
    Arrays.sort(sc);
    Arrays.sort(tc);
    return Arrays.equals(sc, tc);
    // Time: O(n log n), Space: O(n)
}

Approach 2: Frequency Count (optimal)

public boolean isAnagram(String s, String t) {
    if (s.length() != t.length()) return false;
    int[] freq = new int[26];
    for (char c : s.toCharArray()) freq[c - 'a']++;
    for (char c : t.toCharArray()) freq[c - 'a']--;
    for (int f : freq) if (f != 0) return false;
    return true;
    // Time: O(n), Space: O(1) — fixed 26 entries
}

Group Anagrams Together

// Canonical key: sorted version of the word
public List<List<String>> groupAnagrams(String[] strs) {
    Map<String, List<String>> groups = new HashMap<>();
    for (String s : strs) {
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        String key = new String(chars); // canonical key
        groups.computeIfAbsent(key, k -> new ArrayList<>()).add(s);
    }
    return new ArrayList<>(groups.values());
}
// ["eat","tea","tan","ate","nat","bat"]
// → [["eat","tea","ate"],["tan","nat"],["bat"]]

Permutation in String (Sliding Window + Frequency)

Does string s2 contain a permutation of s1?

public boolean checkInclusion(String s1, String s2) {
    if (s1.length() > s2.length()) return false;
    int[] need = new int[26];
    int[] have = new int[26];
    for (char c : s1.toCharArray()) need[c - 'a']++;

    int k = s1.length();
    for (int i = 0; i < s2.length(); i++) {
        have[s2.charAt(i) - 'a']++;
        if (i >= k) have[s2.charAt(i - k) - 'a']--;
        if (Arrays.equals(need, have)) return true;
    }
    return false;
}

Find All Anagrams in String

public List<Integer> findAnagrams(String s, String p) {
    List<Integer> result = new ArrayList<>();
    if (s.length() < p.length()) return result;

    int[] pFreq = new int[26];
    int[] wFreq = new int[26];
    for (char c : p.toCharArray()) pFreq[c - 'a']++;

    int k = p.length();
    for (int i = 0; i < s.length(); i++) {
        wFreq[s.charAt(i) - 'a']++;
        if (i >= k) wFreq[s.charAt(i - k) - 'a']--;
        if (Arrays.equals(pFreq, wFreq)) result.add(i - k + 1);
    }
    return result;
}

Rolling Hash (Rabin-Karp)

For very long patterns, comparing 26-element arrays every step can be slow. Use a polynomial hash:

// hash(s) = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
// Rolling: hash(window) = (hash(prev) - s[i-k]*31^(k-1)) * 31 + s[i]

This reduces window comparison to O(1) amortized.

Interview Tips

  1. For ASCII-only strings: int[26] frequency array is space-efficient and fast.
  2. For Unicode: use HashMap<Character, Integer>.
  3. The sliding window + frequency array pattern appears in many interview problems — master it.

Previous

Prefix Sums

Next

String Two-Pointer Problems

AI Tutor

Lesson: String Hashing and Anagrams

Quick actions

AI responses can be inaccurate. Verify critical information.