:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--color-danger-fg)}.markdown-body .anchor{float:left;margin-left:-20px;padding-right:4px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;background-color:var(--color-border-default);border:0;margin:24px 0;padding:0}.markdown-body blockquote{color:var(--color-fg-muted);border-left:.25em solid var(--color-border-default);padding:0 1em}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:var(--base-text-weight-semibold,600);margin-top:24px;margin-bottom:16px;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{font-size:inherit;padding:0 .2em}.markdown-body h1{border-bottom:1px solid var(--color-border-muted);padding-bottom:.3em;font-size:2em}.markdown-body h2{border-bottom:1px solid var(--color-border-muted);padding-bottom:.3em;font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{color:var(--color-fg-muted);font-size:.85em}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{border-bottom:0;padding-bottom:0}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type=a]{list-style-type:lower-alpha}.markdown-body ol[type=A]{list-style-type:upper-alpha}.markdown-body ol[type=i]{list-style-type:lower-roman}.markdown-body ol[type=I]{list-style-type:upper-roman}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold,600);margin-top:16px;padding:0}.markdown-body dl dd{margin-bottom:16px;padding:0 16px}.markdown-body table{width:100%;width:-webkit-max-content;width:-webkit-max-content;width:max-content;max-width:100%;display:block;overflow:auto}.markdown-body table th{font-weight:var(--base-text-weight-semibold,600)}.markdown-body table th,.markdown-body table td{border:1px solid var(--color-border-default);padding:6px 13px}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:var(--color-canvas-default)}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{float:left;width:auto;border:1px solid var(--color-border-default);margin:13px 0 0;padding:7px;display:block;overflow:hidden}.markdown-body span.frame span img{float:left;display:block}.markdown-body span.frame span span{clear:both;color:var(--color-fg-default);padding:5px 0 0;display:block}.markdown-body span.align-center{clear:both;display:block;overflow:hidden}.markdown-body span.align-center>span{text-align:center;margin:13px auto 0;display:block;overflow:hidden}.markdown-body span.align-center span img{text-align:center;margin:0 auto}.markdown-body span.align-right{clear:both;display:block;overflow:hidden}.markdown-body span.align-right>span{text-align:right;margin:13px 0 0;display:block;overflow:hidden}.markdown-body span.align-right span img{text-align:right;margin:0}.markdown-body span.float-left{float:left;margin-right:13px;display:block;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{float:right;margin-left:13px;display:block;overflow:hidden}.markdown-body span.float-right>span{text-align:right;margin:13px auto 0;display:block;overflow:hidden}.markdown-body code,.markdown-body tt{white-space:break-spaces;background-color:var(--color-neutral-muted);border-radius:6px;margin:0;padding:.2em .4em;font-size:85%}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre{word-wrap:normal}.markdown-body pre code{font-size:100%}.markdown-body pre>code{word-break:normal;white-space:pre;background:0 0;border:0;margin:0;padding:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{word-break:normal;margin-bottom:0}.markdown-body .highlight pre,.markdown-body pre{background-color:var(--color-canvas-subtle);border-radius:6px;padding:16px;font-size:85%;line-height:1.45;overflow:auto}.markdown-body pre code,.markdown-body pre tt{max-width:auto;line-height:inherit;word-wrap:normal;background-color:transparent;border:0;margin:0;padding:0;display:inline;overflow:visible}.markdown-body .csv-data td,.markdown-body .csv-data th{text-align:left;white-space:nowrap;padding:5px;font-size:12px;line-height:1;overflow:hidden}.markdown-body .csv-data .blob-num{text-align:right;background:var(--color-canvas-default);border:0;padding:10px 8px 9px}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:var(--base-text-weight-semibold,600);background:var(--color-canvas-subtle);border-top:0}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{color:var(--color-fg-muted);border-top:1px solid var(--color-border-default);font-size:12px}.markdown-body .footnotes ol{padding-left:16px}.markdown-body .footnotes ol ul{margin-top:16px;padding-left:16px;display:inline-block}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{pointer-events:none;content:"";border:2px solid var(--color-accent-emphasis);border-radius:6px;position:absolute;top:-8px;bottom:-8px;left:-24px;right:-8px}.markdown-body .footnotes li:target{color:var(--color-fg-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body{background-color:var(--color-canvas-default);color:var(--color-fg-default)}.markdown-body a{color:var(--color-accent-fg);text-decoration:none}.markdown-body a:hover{text-decoration:underline}.markdown-body img[align=center]{margin:0 auto}.markdown-body iframe{background-color:#fff;border:0;margin-bottom:16px}.markdown-body svg.octicon{fill:currentColor}.markdown-body .anchor>.octicon{display:inline}.markdown-body figcaption{text-align:center;padding-top:2px}.markdown-body .highlight .token.keyword,.gfm-highlight .token.keyword{color:var(--color-prettylights-syntax-keyword)}.markdown-body .highlight .token.tag .token.class-name,.markdown-body .highlight .token.tag .token.script .token.punctuation,.gfm-highlight .token.tag .token.class-name,.gfm-highlight .token.tag .token.script .token.punctuation{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .highlight .token.operator,.markdown-body .highlight .token.number,.markdown-body .highlight .token.boolean,.markdown-body .highlight .token.tag .token.punctuation,.markdown-body .highlight .token.tag .token.script .token.script-punctuation,.markdown-body .highlight .token.tag .token.attr-name,.gfm-highlight .token.operator,.gfm-highlight .token.number,.gfm-highlight .token.boolean,.gfm-highlight .token.tag .token.punctuation,.gfm-highlight .token.tag .token.script .token.script-punctuation,.gfm-highlight .token.tag .token.attr-name{color:var(--color-prettylights-syntax-constant)}.markdown-body .highlight .token.function,.gfm-highlight .token.function{color:var(--color-prettylights-syntax-entity)}.markdown-body .highlight .token.string,.gfm-highlight .token.string{color:var(--color-prettylights-syntax-string)}.markdown-body .highlight .token.comment,.gfm-highlight .token.comment{color:var(--color-prettylights-syntax-comment)}.markdown-body .highlight .token.class-name,.gfm-highlight .token.class-name{color:var(--color-prettylights-syntax-variable)}.markdown-body .highlight .token.regex,.gfm-highlight .token.regex{color:var(--color-prettylights-syntax-string)}.markdown-body .highlight .token.regex .regex-delimiter,.gfm-highlight .token.regex .regex-delimiter{color:var(--color-prettylights-syntax-constant)}.markdown-body .highlight .token.tag .token.tag,.markdown-body .highlight .token.property,.gfm-highlight .token.tag .token.tag,.gfm-highlight .token.property{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .highlight .token.deleted,.gfm-highlight .token.deleted{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .highlight .token.inserted,.gfm-highlight .token.inserted{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}

Check if a String contains Anagrams of length K which does not contain the character X (original) (raw)

Last Updated : 15 Jul, 2025

Given a string S, the task is to check if S contains a pair of substrings of length K which are anagrams of each other and doesn't contain the character X in them. If no such substring exists, print -1.

Examples:

Input: S = "geeksforgeeks", X = 'f', K = 5
Output: geeks geeks
Explanation:
Substrings "geeks" and "geeks" are anagrams of each other and does not contain 'f'.

Input: S = "rotator", X = 'a', K = 3
Output: rot tor
Explanation:
Substrings "rot" and "tor" are anagrams of each other and does not contain 'a'.

Approach:
The idea is to generate prefix sum on the basis of characters. Follow the steps below to solve the problem:

Below is the implementation of the above approach:

C++ `

// c++ code for the above approach #include #include #include

#define MOD 1000000007

using namespace std;

// Class to represent a Substring // in terms of frequency of // characters present in it class Substring { public: int count[26];

Substring() { memset(count, 0, sizeof(count)); }

bool operator==(const Substring& other) const
{
    for (int i = 0; i < 26; i++) {
        if (other.count[i] != count[i]) {
            return false;
        }
    }
    return true;
}

size_t operator()(const Substring& s) const
{
    size_t hash = 0;
    for (int i = 0; i < 26; i++) {
        hash += (i + 1) * s.count[i];
        hash %= MOD;
    }
    return hash;
}

};

// Function to check anagrams void checkForAnagrams(string s, int n, char X, int k) { bool found = false;

// Prefix array to store frequencies
// of characters
int prefix[n + 1][26];
memset(prefix, 0, sizeof(prefix));
for (int i = 0; i < n; i++) {
    prefix[i][s[i] - 'a'] += 1;
}

// Generate prefix sum
for (int i = 1; i < n; i++) {
    for (int j = 0; j < 26; j++) {
        prefix[i][j] += prefix[i - 1][j];
    }
}

// Map to store frequencies
unordered_map<Substring, int, Substring> map;

// Check for anagrams
for (int i = 0; i < n; i++) {
    if (i + k > n) {
        break;
    }

    // Generate frequencies of characters
    // of substring starting from i
    Substring sub;
    for (int j = 0; j < 26; j++) {
        sub.count[j]
            = prefix[i + k - 1][j]
              - (i - 1 >= 0 ? prefix[i - 1][j] : 0);
    }

    // Check if forbidden character is
    // present, then continue
    if (sub.count[X - 'a'] != 0) {
        continue;
    }

    // If already present in HashMap
    if (map.count(sub) > 0) {
        found = true;

        // Print the substrings
        cout << s.substr(map[sub], k) << " "
             << s.substr(i, k) << endl;
        break;
    }
    else {
        map[sub] = i;
    }
}

// If no such substring is found
if (!found) {
    cout << "-1" << endl;
}

}

// Driver Code int main() { string s = "rotator"; int n = s.length(); char X = 'a'; int k = 3; checkForAnagrams(s, n, X, k); return 0; }

Java

// Java Program to implement // the above approach import java.util.*;

// Class to represent a Substring // in terms of frequency of // characters present in it class Substring { int MOD = 1000000007;

// Store count of characters
int count[];
Substring() { count = new int[26]; }

public int hashCode()
{
    int hash = 0;
    for (int i = 0; i < 26; i++) {
        hash += (i + 1) * count[i];
        hash %= MOD;
    }
    return hash;
}

public boolean equals(Object o)
{
    if (o == this)
        return true;
    if (!(o instanceof Substring))
        return false;
    Substring ob = (Substring)o;
    for (int i = 0; i < 26; i++) {
        if (ob.count[i] != count[i])
            return false;
    }
    return true;
}

} class GFG {

// Function to check anagrams
static void checkForAnagrams(String s, int n,
                             char X, int k)
{
    boolean found = false;

    // Prefix array to store frequencies
    // of characters
    int prefix[][] = new int[n + 1][26];
    for (int i = 0; i < n; i++) {
        prefix[i][s.charAt(i) - 97]++;
    }

    // Generate prefix sum
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < 26; j++)
            prefix[i][j] += prefix[i - 1][j];
    }

    // Map to store frequencies
    HashMap<Substring, Integer> map
        = new HashMap<>();

    // Check for anagrams
    for (int i = 0; i < n; i++) {
        if (i + k > n)
            break;

        // Generate frequencies of characters
        // of substring starting from i
        Substring sub = new Substring();
        for (int j = 0; j < 26; j++) {
            sub.count[j]
                = prefix[i + k - 1][j]
                  - (i - 1 >= 0
                         ? prefix[i - 1][j]
                         : 0);
        }

        // Check if forbidden character is
        // present, then continue
        if (sub.count[X - 97] != 0)
            continue;

        // If already present in HashMap
        if (map.containsKey(sub)) {

            found = true;

            // Print the substrings
            System.out.println(
                s.substring(map.get(sub),
                            map.get(sub) + k)
                + " " + s.substring(i, i + k));
            break;
        }
        else {
            map.put(sub, i);
        }
    }

    // If no such substring is found
    if (!found)
        System.out.println("-1");
}

// Driver Code
public static void main(String[] args)
{
    String s = "rotator";
    int n = s.length();
    char X = 'a';
    int k = 3;
    checkForAnagrams(s, n, X, k);
}

}

Python3

Python Program to implement

the above approach

import sys MOD = 1000000007

Class to represent a Substring

in terms of frequency of

characters present in it

class Substring: def init(self): self.count = [0] * 26

def __hash__(self):
    hash = 0
    for i in range(26):
        hash += (i + 1) * self.count[i]
        hash %= MOD
    return hash

def __eq__(self, other):
    if self is other:
        return True
    if not isinstance(other, Substring):
        return False
    ob = other
    for i in range(26):
        if ob.count[i] != self.count[i]:
            return False
    return True

Function to check anagrams

def checkForAnagrams(s, n, X, k): found = False

# Prefix array to store frequencies
# of characters
prefix = [[0 for i in range(26)] for j in range(n + 1)]
for i in range(n):
    prefix[i][ord(s[i]) - 97] += 1

# Generate prefix sum
for i in range(1, n):
    for j in range(26):
        prefix[i][j] += prefix[i - 1][j]

# Map to store frequencies
map = {}

# Check for anagrams
for i in range(n):
    if i + k > n:
        break

    # Generate frequencies of characters
    # of substring starting from i
    sub = Substring()
    for j in range(26):
        sub.count[j] = prefix[i + k - 1][j] - (prefix[i - 1][j] if i - 1 >= 0 else 0)

    # Check if forbidden character is
    # present, then continue
    if sub.count[ord(X) - 97] != 0:
        continue

    # If already present in HashMap
    if sub in map:
        found = True

        # Print the substrings
        print(s[map[sub]:map[sub] + k], s[i:i + k])
        break
    else:
        map[sub] = i

# If no such substring is found
if not found:
    print("-1")

Driver Code

if name == "main": s = "rotator" n = len(s) X = 'a' k = 3 checkForAnagrams(s, n, X, k)

Contributed by adityasha4x71

C#

// c# code for the above approach using System; using System.Collections.Generic;

namespace Anagrams { // Class to represent a Substring // in terms of frequency of // characters present in it class Substring { public int[] count;

public Substring()
{
    count = new int[26];
    Array.Fill(count, 0);
}

public override bool Equals(object obj)
{
    Substring other = obj as Substring;
    if (other == null) {
        return false;
    }
    for (int i = 0; i < 26; i++) {
        if (other.count[i] != count[i]) {
            return false;
        }
    }
    return true;
}

public override int GetHashCode()
{
    const int MOD = 1000000007;
    int hash = 0;
    for (int i = 0; i < 26; i++) {
        hash += (i + 1) * count[i];
        hash %= MOD;
    }
    return hash;
}

}

class Program { // Function to check anagrams static void CheckForAnagrams(string s, int n, char X, int k) { bool found = false;

    // Prefix array to store frequencies
    // of characters
    int[, ] prefix = new int[n + 1, 26];
    for (int i = 0; i < n; i++) {
        prefix[i, s[i] - 'a'] += 1;
    }

    // Generate prefix sum
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < 26; j++) {
            prefix[i, j] += prefix[i - 1, j];
        }
    }

    // Dictionary to store frequencies
    Dictionary<Substring, int> map
        = new Dictionary<Substring, int>();

    // Check for anagrams
    for (int i = 0; i < n; i++) {
        if (i + k > n) {
            break;
        }

        // Generate frequencies of characters
        // of substring starting from i
        Substring sub = new Substring();
        for (int j = 0; j < 26; j++) {
            sub.count[j]
                = prefix[i + k - 1, j]
                  - (i - 1 >= 0 ? prefix[i - 1, j] : 0);
        }

        // Check if forbidden character is
        // present, then continue
        if (sub.count[X - 'a'] != 0) {
            continue;
        }

        // If already present in Dictionary
        if (map.ContainsKey(sub)) {
            found = true;

            // Print the substrings
            Console.WriteLine(s.Substring(map[sub], k)
                              + " "
                              + s.Substring(i, k));
            break;
        }
        else {
            map[sub] = i;
        }
    }

    // If no such substring is found
    if (!found) {
        Console.WriteLine("-1");
    }
}

// Driver Code
static void Main(string[] args)
{
    string s = "rotator";
    int n = s.Length;
    char X = 'a';
    int k = 3;
    CheckForAnagrams(s, n, X, k);
}

} }

JavaScript

function Substring() { this.count = new Array(26).fill(0); }

Substring.prototype.hash = function() { let hash = 0; for (let i = 0; i < 26; i++) { hash += (i + 1) * this.count[i]; hash %= 1000000007; } return hash; }

Substring.prototype.equals = function(other) { if (this === other) { return true; } if (!(other instanceof Substring)) { return false; } let ob = other; for (let i = 0; i < 26; i++) { if (ob.count[i] !== this.count[i]) { return false; } } return true; }

function checkForAnagrams(s, n, X, k) { let found = false;

// Prefix array to store frequencies of characters
let prefix = new Array(n + 1);
for (let i = 0; i <= n; i++) {
    prefix[i] = new Array(26).fill(0);
}

for (let i = 0; i < n; i++) {
    prefix[i][s.charCodeAt(i) - 97]++;
}

// Generate prefix sum
for (let i = 1; i < n; i++) {
    for (let j = 0; j < 26; j++) {
        prefix[i][j] += prefix[i - 1][j];
    }
}

// Map to store frequencies of substrings
let map = new Map();

// Check for anagrams
for (let i = 0; i < n; i++) {
    if (i + k > n) {
        break;
    }

    // Generate frequencies of characters
    // of substring starting from i
    let sub = new Substring();
    for (let j = 0; j < 26; j++) {
        sub.count[j] = prefix[i + k - 1][j] - ((i - 1 >= 0) ? prefix[i - 1][j] : 0);

    }

    // Check if forbidden character is present, then continue
    if (sub.count[X.charCodeAt(0) - 97] !== 0) {
        continue;
    }

    // If already present in Map
    if (map.has(sub.hash())) {
        found = true;

        // Print the substrings
        console.log(s.substring(map.get(sub.hash()), map.get(sub.hash()) + k), s.substring(i, i + k));
        break;
    } else {
        map.set(sub.hash(), i);
    }
}

// If no such substring is found
if (!found) {
    console.log("-1");
}

}

let s = "rotator"; let n = s.length; let X = 'a'; let k = 3; checkForAnagrams(s, n, X, k);

`

Time Complexity: O(N*26)
Auxiliary Space: O(N*26)