: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)}

Longest Substring Without Repeating Characters (original) (raw)

Last Updated : 04 Aug, 2025

Try it on GfG Practice redirect icon

Given a string **s having **lowercase characters, find the length of the longest substring without repeating characters.

**Examples:

**Input: s = "geeksforgeeks"
**Output: 7
**Explanation: The longest substrings without repeating characters are "eksforg” and "ksforge", with lengths of 7.

**Input: s = "aaa"
**Output: 1
**Explanation: The longest substring without repeating characters is "a"

**Input: s = "abcdefabcbb"
**Output: 6
**Explanation: The longest substring without repeating characters is "abcdef".

Table of Content

**[Naive Approach] Substrings Starting From Every Index - O(26*n) Time and O(1) Space

The idea is to find length of longest substring with distinct characters starting from every index and maximum of all such lengths will be our answer.

To find the length of the longest substring with distinct characters starting from an index, we create a new visited array of size = 26 to keep track of included characters in the substring. vis[0] checks for 'a', vis[1] checks for 'b', vis[2] checks for 'c' and so on.

**Note: The array size is fixed at 26, representing the lowercase English alphabet as a constant

C++ `

#include #include using namespace std;

int longestUniqueSubstr(string &s){ int n = s.size(); int res = 0;

for (int i = 0; i < n; i++){

    // Initializing all characters as not visited
    vector<bool> vis(26, false);

    for (int j = i; j < n; j++){

        // If current character is visited
        // Break the loop
        if (vis[s[j] - 'a'] == true)
            break;

        // Else update the result if this window is larger,
        // and mark current character as visited.
        else
        {
            res = max(res, j - i + 1);
            vis[s[j] - 'a'] = true;
        }
    }
}
return res;

}

int main(){ string s = "geeksforgeeks"; cout << longestUniqueSubstr(s); return 0; }

Java

class GfG {

static int longestUniqueSubstr(String s){
    int n = s.length();
    int res = 0;

    for (int i = 0; i < n; i++) {

        // Initializing all characters as not visited
        boolean[] vis = new boolean[26];

        for (int j = i; j < n; j++) {

            // If current character is visited
            // Break the loop
            if (vis[s.charAt(j) - 'a'] == true)
                break;

            // Else update the result if this window is
            // larger, and mark current character as
            // visited.
            else {
                res = Math.max(res, j - i + 1);
                vis[s.charAt(j) - 'a'] = true;
            }
        }
    }
    return res;
}

public static void main(String[] args){
    String s = "geeksforgeeks";
    System.out.println(longestUniqueSubstr(s));
}

}

Python

def longestUniqueSubstr(s): n = len(s) res = 0

for i in range(n):

    # Initializing all characters as not visited
    vis = [False] * 26

    for j in range(i, n):

        # If current character is visited
        # Break the loop
        if vis[ord(s[j]) - ord('a')] == True:
            break

        # Else update the result if this window is larger,
        # and mark current character as visited.
        else:
            res = max(res, j - i + 1)
            vis[ord(s[j]) - ord('a')] = True
return res

if name == "main": s = "geeksforgeeks" print(longestUniqueSubstr(s))

C#

using System;

class GfG {

static int longestUniqueSubstr(string s) {
    int n = s.Length;
    int res = 0;

    for (int i = 0; i < n; i++) {

        // Initializing all characters as not visited
        bool[] vis = new bool[26];

        for (int j = i; j < n; j++) {

            // If current character is visited
            // Break the loop
            if (vis[s[j] - 'a'] == true)
                break;

            // Else update the result if this window is larger,
            // and mark current character as visited.
            else {
                res = Math.Max(res, j - i + 1);
                vis[s[j] - 'a'] = true;
            }
        }
    }
    return res;
}

static void Main() {
    string s = "geeksforgeeks";
    Console.WriteLine(longestUniqueSubstr(s));
}

}

JavaScript

function longestUniqueSubstr(s) { let n = s.length; let res = 0;

for (let i = 0; i < n; i++) {

    // Initializing all characters as not visited
    let vis = new Array(26).fill(false);

    for (let j = i; j < n; j++) {

        // If current character is visited
        // Break the loop
        if (vis[s.charCodeAt(j) - 'a'.charCodeAt(0)] === true)
            break;

        // Else update the result if this window is larger,
        // and mark current character as visited.
        else {
            res = Math.max(res, j - i + 1);
            vis[s.charCodeAt(j) - 'a'.charCodeAt(0)] = true;
        }
    }
}
return res;

}

// Driver Code let s = "geeksforgeeks"; console.log(longestUniqueSubstr(s));

`

**Time Complexity: O(n*26), the outer loop runs O(n) time, and the inner loop runs in O(26) in the worst case (considering all unique characters), resulting in a total time complexity of O(n*26).
**Auxiliary Space: O(1), vis array has size 26 which is constant.

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

The idea is to maintain a window of distinct characters. The window is initialized as single character. We keep extending the window on the right side till we see distinct characters. When we see a repeating character, we remove characters from the left side of the window. We keep track of the maximum length window.

Below are the detailed steps:

**Working:

C++ `

#include #include using namespace std;

int longestUniqueSubstr(string& s) { if (s.length() == 0 || s.length() == 1) return s.length();

int res = 0;
vector<bool>vis(26, false);

// left and right pointer of sliding window
int left = 0, right = 0;
while (right < s.length()) {

    // If character is repeated, move left pointer marking
      // visited characters as false until the repeating 
      // character is no longer part of the current window
    while (vis[s[right] - 'a'] == true) {

            vis[s[left] - 'a'] = false;
            left++;
       }

    vis[s[right] - 'a'] = true;

    // The length of the current window (right - left + 1)
    // is calculated and answer is updated accordingly.
    res = max(res, (right - left + 1));
    right++;
}
return res;

}

int main() { string s = "geeksforgeeks"; cout << longestUniqueSubstr(s); return 0; }

Java

class GfG {

static int longestUniqueSubstr(String s) {
    if (s.length() == 0 || s.length() == 1)
        return s.length();

    int res = 0;
    boolean[] vis = new boolean[26];

    // left and right pointer of sliding window
    int left = 0, right = 0;
    while (right < s.length()) {

        // If character is repeated, move left pointer marking
        // visited characters as false until the repeating 
        // character is no longer part of the current window
        while (vis[s.charAt(right) - 'a'] == true) {
            vis[s.charAt(left) - 'a'] = false;
            left++;
        }

        vis[s.charAt(right) - 'a'] = true;

        // The length of the current window (right - left + 1)
        // is calculated and answer is updated accordingly.
        res = Math.max(res, (right - left + 1));
        right++;
    }
    return res;
}

public static void main(String[] args) {
    String s = "geeksforgeeks";
    System.out.println(longestUniqueSubstr(s));
}

}

Python

MAX_CHAR = 26

def longestUniqueSubstr(s): if len(s) == 0 or len(s) == 1: return len(s)

res = 0
vis = [False] * 26

# left and right pointer of sliding window
left = 0
right = 0
while right < len(s):

    # If character is repeated, move left pointer marking
    # visited characters as false until the repeating 
    # character is no longer part of the current window
    while vis[ord(s[right]) - ord('a')] == True:
        vis[ord(s[left]) - ord('a')] = False
        left += 1

    vis[ord(s[right]) - ord('a')] = True

    # The length of the current window (right - left + 1)
    # is calculated and answer is updated accordingly.
    res = max(res, (right - left + 1))
    right += 1

return res

if name == "main": s = "geeksforgeeks" print(longestUniqueSubstr(s))

C#

using System;

class GfG {

static int longestUniqueSubstr(string s) {
    if (s.Length == 0 || s.Length == 1)
        return s.Length;

    int res = 0;
    bool[] vis = new bool[26];

    // left and right pointer of sliding window
    int left = 0, right = 0;
    while (right < s.Length) {
      
        while (vis[s[right] - 'a'] == true) {
            vis[s[left] - 'a'] = false;
            left++;
        }

        vis[s[right] - 'a'] = true;

        // The length of the current window (right - left + 1)
        // is calculated and answer is updated accordingly.
        res = Math.Max(res, (right - left + 1));
        right++;
    }
    return res;
}

static void Main() {
    string s = "geeksforgeeks";
    Console.WriteLine(longestUniqueSubstr(s));
}

}

JavaScript

function longestUniqueSubstr(s) { if (s.length === 0 || s.length === 1) return s.length;

let res = 0;
let vis = new Array(26).fill(false);

// left and right pointer of sliding window
let left = 0, right = 0;
while (right < s.length) {

    while (vis[s[right].charCodeAt(0) - 'a'.charCodeAt(0)] === true) {

        vis[s[left].charCodeAt(0) - 'a'.charCodeAt(0)] = false;
        left++;
    }

    vis[s[right].charCodeAt(0) - 'a'.charCodeAt(0)] = true;

    res = Math.max(res, (right - left + 1));
    right++;
}
return res;

}

// Driver Code const s = "geeksforgeeks"; console.log(longestUniqueSubstr(s));

`

**[Expected Approach 2] Using Last Index of Each Character - O(n) Time and O(1) Space

The approach stores the last indexes of already visited characters. The idea is to maintain a window of distinct characters. Start from the first character, and keep extending the window on the right side till we see distinct characters. When we see a repeating character, we check for the last index of the repeated character:

After iterating over all the characters, the largest window size will be our answer.

**Working:

C++ `

#include #include using namespace std;

int longestUniqueSubstr(string &s) { int n = s.size(); int res = 0;

vector<int> lastIndex(26, -1);

// Initialize start of current window
int start = 0;

// Move end of current window
for (int end = 0; end < n; end++) {

    start = max(start, lastIndex[s[end] - 'a'] + 1);

    // Update result if we get a larger window
    res = max(res, end - start + 1);

    // Update last index of s[end]
    lastIndex[s[end] - 'a'] = end;
}
return res;

}

int main() { string s = "geeksforgeeks"; cout << longestUniqueSubstr(s); return 0; }

Java

class GfG {

static int longestUniqueSubstr(String s) {
    int n = s.length();
    int res = 0;

    // last index of all characters is initialized as -1
    int[] lastIndex = new int[26];
    for (int i = 0; i < 26; i++) {
        lastIndex[i] = -1;
    }

    // Initialize start of current window
    int start = 0;

    // Move end of current window
    for (int end = 0; end < n; end++) {

        // Find the last index of s[end]
        // Update starting index of current window as
        // maximum of current value of end and last index + 1
        start = Math.max(start, lastIndex[s.charAt(end) - 'a'] + 1);

        // Update result if we get a larger window
        res = Math.max(res, end - start + 1);

        // Update last index of s[end]
        lastIndex[s.charAt(end) - 'a'] = end;
    }
    return res;
}

public static void main(String[] args) {
    String s = "geeksforgeeks";
    System.out.println(longestUniqueSubstr(s));
}

}

Python

def longestUniqueSubstr(s): n = len(s) res = 0

lastIndex = [-1] * 26

# Initialize start of current window
start = 0

# Move end of current window
for end in range(n):

    start = max(start, lastIndex[ord(s[end]) - ord('a')] + 1)

    # Update result if we get a larger window
    res = max(res, end - start + 1)

    # Update last index of s[end]
    lastIndex[ord(s[end]) - ord('a')] = end

return res

if name == "main": s = "geeksforgeeks" print(longestUniqueSubstr(s))

C#

using System;

class GfG { const int MAX_CHAR = 26; public static int longestUniqueSubstr(string s) { int n = s.Length; int res = 0;

    // last index of all characters is initialized as -1
    int[] lastIndex = new int[MAX_CHAR];
    for (int i = 0; i < MAX_CHAR; i++) {
        lastIndex[i] = -1;
    }

    // Initialize start of current window
    int start = 0;

    // Move end of current window
    for (int end = 0; end < n; end++) {

       
        start = Math.Max(start, lastIndex[s[end] - 'a'] + 1);

        // Update result if we get a larger window
        res = Math.Max(res, end - start + 1);

        // Update last index of s[end]
        lastIndex[s[end] - 'a'] = end;
    }
    return res;
}

static void Main() {
    string s = "geeksforgeeks";
    Console.WriteLine(longestUniqueSubstr(s));
}

}

JavaScript

function longestUniqueSubstr(s) { const n = s.length; let res = 0;

// last index of all characters is initialized as -1
const lastIndex = new Array(26).fill(-1);

// Initialize start of current window
let start = 0;

// Move end of current window
for (let end = 0; end < n; end++) {

    start = Math.max(start, lastIndex[s.charCodeAt(end) - 'a'.charCodeAt(0)] + 1);

    // Update result if we get a larger window
    res = Math.max(res, end - start + 1);

    // Update last index of s[end]
    lastIndex[s.charCodeAt(end) - 'a'.charCodeAt(0)] = end;
}
return res;

}

// Driver Code const s = "geeksforgeeks"; console.log(longestUniqueSubstr(s));

`

Longest Substring With Distinct Character

Longest substring without repeating characters