Smallest window that contains all characters of string itself (original) (raw)

Last Updated : 14 Mar, 2026

Given a string **str, find the **smallest window length that contains all the characters of the given string at least one time.

**Examples:

**Input: str = "aabcbcdbca"
**Output: 4
**Explanation: Sub-string -> "dbca"

**Input: str = "aaab"
**Output: 2
**Explanation: Sub-string -> "ab"

Try It Yourselfredirect icon

Table of Content

[Naive Approach] - Generating All Substrings - O(n ^ 2) Time and O(1) Space

#include using namespace std;

int findSubString(string &str) { int n = str.size();

int ans = n;

// to store all distinct characters
vector<bool> visited(26, false);
for (int i = 0; i < n; i++) {
    visited[str[i]-'a'] = true;
}

for(int i = 0; i < n; i++) {
    vector<bool> cur(26, false);

    for(int j = i; j < n; j++) {
        cur[str[j]-'a'] = true;

        // if all characters are present
        if(cur == visited) {
            ans = min(ans, j - i + 1);
            break;
        }
    }
}

return ans;

}

int main() { string str = "aabcbcdbca"; cout << findSubString(str); return 0; }

Java

import java.util.Arrays;

class GfG {

public static int findSubString(String str) {
    int n = str.length();

    int ans = n;

    // to store all distinct characters
    boolean[] visited = new boolean[26];
    for (int i = 0; i < n; i++) {
        visited[str.charAt(i) - 'a'] = true;
    }

    for (int i = 0; i < n; i++) {
        boolean[] cur = new boolean[26];

        for (int j = i; j < n; j++) {
            cur[str.charAt(j) - 'a'] = true;

            // if all characters are present
            if (Arrays.equals(cur, visited)) {
                ans = Math.min(ans, j - i + 1);
                break;
            }
        }
    }

    return ans;
}

public static void main(String[] args) {
    String str = "aabcbcdbca";
    System.out.print(findSubString(str));
}

}

Python

def findSubString(str): n = len(str)

ans = n

# to store all distinct characters
visited = [False] * 26
for i in range(n):
    visited[ord(str[i]) - ord('a')] = True

for i in range(n):
    cur = [False] * 26

    for j in range(i, n):
        cur[ord(str[j]) - ord('a')] = True

        # if all characters are present
        if cur == visited:
            ans = min(ans, j - i + 1)
            break

return ans

if name == "main": str = "aabcbcdbca" print(findSubString(str))

C#

using System; using System.Linq;

class GfG {

public static int findSubString(string str) {
    int n = str.Length;

    int ans = n;

    // to store all distinct characters
    bool[] visited = new bool[26];
    for (int i = 0; i < n; i++) {
        visited[str[i] - 'a'] = true;
    }

    for (int i = 0; i < n; i++) {
        bool[] cur = new bool[26];

        for (int j = i; j < n; j++) {
            cur[str[j] - 'a'] = true;

            // if all characters are present
            if (cur.SequenceEqual(visited)) {
                ans = Math.Min(ans, j - i + 1);
                break;
            }
        }
    }

    return ans;
}

static void Main() {
    string str = "aabcbcdbca";
    Console.Write(findSubString(str));
}

}

JavaScript

function findSubString(str) { let n = str.length;

let ans = n;

// to store all distinct characters
let visited = new Array(26).fill(false);
for (let i = 0; i < n; i++) {
    visited[str.charCodeAt(i) - 97] = true;
}

for (let i = 0; i < n; i++) {
    let cur = new Array(26).fill(false);

    for (let j = i; j < n; j++) {
        cur[str.charCodeAt(j) - 97] = true;

        // if all characters are present
        if (JSON.stringify(cur) === JSON.stringify(visited)) {
            ans = Math.min(ans, j - i + 1);
            break;
        }
    }
}

return ans;

}

let str = "aabcbcdbca"; console.log(findSubString(str));

`

[Expected Approach] - Using Sliding Window - O(n) Time and O(1) Space

Smallest-window-that-contains-all-characters-of-string-itself

C++ `

#include using namespace std;

int findSubString(string str) { int n = str.size();

// to store all distinct characters
vector<bool> visited(26, false);
int distinct = 0;

for (int i = 0; i < n; i++) {
    if (visited[str[i] - 'a'] == false) {
        visited[str[i] - 'a'] = true;
        distinct++;
    }
}

// to store the visited of characters
// in the current window
vector<int> cur(26, 0);
int cnt = 0;

int ans = n;
int start = 0;
for(int i = 0; i < n; i++) {
    
    // Count characters in the current
    // window
    cur[str[i] - 'a']++;
    if(cur[str[i] - 'a'] == 1) {
        cnt++;
    }
    
    // If the count becomes same as overall
    while(cnt == distinct) {
        ans = min(ans, i - start + 1);
        
        // Remove characters from left
        cur[str[start] - 'a']--;
        if(cur[str[start] - 'a'] == 0) {
            cnt--;
        }
        start++;
    }
}
return ans;

}

int main() { string str = "aabcbcdbca"; cout << findSubString(str); return 0; }

Java

import java.util.Arrays;

class GfG {

public static int findSubString(String str) {
    int n = str.length();


    // to store all distinct characters
    boolean[] visited = new boolean[26];
    int distinct = 0;

    for (int i = 0; i < n; i++) {
        if (visited[str.charAt(i) - 'a'] == false) {
            visited[str.charAt(i) - 'a'] = true;
            distinct++;
        }
    }


    // to store the visited of characters
    // in the current window
    int[] cur = new int[26];
    int cnt = 0;

    int ans = n;
    int start = 0;
    for (int i = 0; i < n; i++) {
        cur[str.charAt(i) - 'a']++;

        if (cur[str.charAt(i) - 'a'] == 1) {
            cnt++;
        }
        while (cnt == distinct) {
            ans = Math.min(ans, i - start + 1);
            cur[str.charAt(start) - 'a']--;
            if (cur[str.charAt(start) - 'a'] == 0) {
                cnt--;
            }
            start++;
        }
    }
    return ans;
}

public static void main(String[] args) {
    String str = "aabcbcdbca";
    System.out.print(findSubString(str));
}

}

Python

def findSubString(str): n = len(str)

# to store all distinct characters
visited = [False] * 26
distinct = 0

for i in range(n):
    if visited[ord(str[i]) - ord('a')] == False:
        visited[ord(str[i]) - ord('a')] = True
        distinct += 1


# to store the visited of characters

# in the current window
cur = [0] * 26
cnt = 0

ans = n
start = 0
for i in range(n):
    cur[ord(str[i]) - ord('a')] += 1

    if cur[ord(str[i]) - ord('a')] == 1:
        cnt += 1
    while cnt == distinct:
        ans = min(ans, i - start + 1)
        cur[ord(str[start]) - ord('a')] -= 1
        if cur[ord(str[start]) - ord('a')] == 0:
            cnt -= 1
        start += 1
return ans

if name == "main": str = "aabcbcdbca" print(findSubString(str))

C#

using System;

class GfG {

public static int findSubString(string str) {
    int n = str.Length;
    
    // to store all distinct characters
    bool[] visited = new bool[26];
    int distinct = 0;

    for (int i = 0; i < n; i++) {
        if (visited[str[i] - 'a'] == false) {
            visited[str[i] - 'a'] = true;
            distinct++;
        }
    }

    // to store the visited of characters
    // in the current window
    int[] cur = new int[26];
    int cnt = 0;

    int ans = n;
    int start = 0;
    for (int i = 0; i < n; i++) {
        cur[str[i] - 'a']++;

        if (cur[str[i] - 'a'] == 1) {
            cnt++;
        }
        while (cnt == distinct) {
            ans = Math.Min(ans, i - start + 1);
            cur[str[start] - 'a']--;
            if (cur[str[start] - 'a'] == 0) {
                cnt--;
            }
            start++;
        }
    }
    return ans;
}

static void Main() {
    string str = "aabcbcdbca";
    Console.Write(findSubString(str));
}

}

JavaScript

function findSubString(str) { let n = str.length;

// to store all distinct characters
let visited = new Array(26).fill(false);
let distinct = 0;

for (let i = 0; i < n; i++) {
    if (visited[str.charCodeAt(i) - 97] == false) {
        visited[str.charCodeAt(i) - 97] = true;
        distinct++;
    }
}

// to store the visited of characters
// in the current window
let cur = new Array(26).fill(0);
let cnt = 0;

let ans = n;
let start = 0;
for (let i = 0; i < n; i++) {
    cur[str.charCodeAt(i) - 97]++;

    if (cur[str.charCodeAt(i) - 97] == 1) {
        cnt++;
    }
    while (cnt == distinct) {
        ans = Math.min(ans, i - start + 1);
        cur[str.charCodeAt(start) - 97]--;
        if (cur[str.charCodeAt(start) - 97] == 0) {
            cnt--;
        }
        start++;
    }
}
return ans;

}

// driver code let str = "aabcbcdbca"; console.log(findSubString(str));

`

**Related Article: