Related Articles
Print Longest substring without repeating characters
• Difficulty Level : Hard
• Last Updated : 08 Oct, 2020

Given a string, print the longest substring without repeating characters. For example, the longest substrings without repeating characters for “ABDEFGABEF” are “BDEFGA” and “DEFGAB”, with length 6. For “BBBB” the longest substring is “B”, with length 1. The desired time complexity is O(n) where n is the length of the string.
Prerequisite: Length of longest substring without repeating characters
Examples:

```Input : GEEKSFORGEEKS
Output : EKSFORG

Input : ABDEFGABEF
Output : BDEFGA

```

Approach: The idea is to traverse the string and for each already visited character store its last occurrence in a hash table(Here unordered_map is used as a hash with key as character and value as its last position). The variable st stores the starting point of the current substring, maxlen stores the length of maximum length substring, and start stores the starting index of maximum length substring. While traversing the string, check whether the current character is present in the hash table or not. If it is not present, then store the current character in the hash table with value as the current index. If it is already present in the hash table, this means the current character could repeat in the current substring. For this check, if the previous occurrence of character is before or after the starting point st of the current substring. If it is before st, then only update the value in the hash table. If it is after st, then find the length of current substring currlen as i-st, where i is the current index. Compare currlen with maxlen. If maxlen is less than currlen, then update maxlen as currlen and start as st. After complete traversal of the string, the required the longest substring without repeating characters is from s[start] to s[start+maxlen-1].
Implementation:

## C++

 `// C++ program to find and print longest``// substring without repeating characters.``#include ` `using` `namespace` `std;` `// Function to find and print longest``// substring without repeating characters.``string findLongestSubstring(string str)``{``    ``int` `i;``    ``int` `n = str.length();` `    ``// starting point of current substring.``    ``int` `st = 0;` `    ``// length of current substring.``    ``int` `currlen;` `    ``// maximum length substring without repeating``    ``// characters.``    ``int` `maxlen = 0;` `    ``// starting index of maximum length substring.``    ``int` `start;` `    ``// Hash Map to store last occurrence of each``    ``// already visited character.``    ``unordered_map<``char``, ``int``> pos;` `    ``// Last occurrence of first character is index 0;``    ``pos[str] = 0;` `    ``for` `(i = 1; i < n; i++) {` `        ``// If this character is not present in hash,``        ``// then this is first occurrence of this``        ``// character, store this in hash.``        ``if` `(pos.find(str[i]) == pos.end())``            ``pos[str[i]] = i;` `        ``else` `{``            ``// If this character is present in hash then``            ``// this character has previous occurrence,``            ``// check if that occurrence is before or after``            ``// starting point of current substring.``            ``if` `(pos[str[i]] >= st) {` `                ``// find length of current substring and``                ``// update maxlen and start accordingly.``                ``currlen = i - st;``                ``if` `(maxlen < currlen) {``                    ``maxlen = currlen;``                    ``start = st;``                ``}` `                ``// Next substring will start after the last``                ``// occurrence of current character to avoid``                ``// its repetition.``                ``st = pos[str[i]] + 1;``            ``}` `            ``// Update last occurrence of``            ``// current character.``            ``pos[str[i]] = i;``        ``}``    ``}` `    ``// Compare length of last substring with maxlen and``    ``// update maxlen and start accordingly.``    ``if` `(maxlen < i - st) {``        ``maxlen = i - st;``        ``start = st;``    ``}` `    ``// The required longest substring without``    ``// repeating characters is from str[start]``    ``// to str[start+maxlen-1].``    ``return` `str.substr(start, maxlen);``}` `// Driver function``int` `main()``{``    ``string str = ``"GEEKSFORGEEKS"``;``    ``cout << findLongestSubstring(str);``    ``return` `0;``}`

## Java

 `// Java program to find``// and print longest substring``// without repeating characters.``import` `java.util.*;``class` `GFG{` `// Function to find and print longest``// substring without repeating characters.``public` `static` `String findLongestSubstring(String str)``{``    ``int` `i;``    ``int` `n = str.length();``    ` `    ``// Starting point``    ``// of current substring.``    ``int` `st = ``0``;``    ` `    ``// length of``    ``// current substring.``    ``int` `currlen = ``0``;``    ` `    ``// maximum length``    ``// substring without``    ``// repeating characters.``    ``int` `maxlen = ``0``;``    ` `    ``// starting index of``    ``// maximum length substring.``    ``int` `start = ``0``;``    ` `    ``// Hash Map to store last``    ``// occurrence of each``    ` `    ``// already visited character.``    ``HashMap pos = ``new` `HashMap();``    ` `    ``// Last occurrence of first``    ``// character is index 0;``    ``pos.put(str.charAt(``0``), ``0``);``    ` `    ``for` `(i = ``1``; i < n; i++)``    ``{``        ``// If this character is not present in hash,``        ``// then this is first occurrence of this``        ``// character, store this in hash.``        ``if` `(!pos.containsKey(str.charAt(i)))``        ``{``            ``pos.put(str.charAt(i), i);``        ``}``        ``else``        ``{``            ``// If this character is present``            ``// in hash then this character``            ``// has previous occurrence,``            ``// check if that occurrence``            ``// is before or after starting``            ``// point of current substring.``            ``if` `(pos.get(str.charAt(i)) >= st)``            ``{``                ``// find length of current``                ``// substring and update maxlen``                ``// and start accordingly.``                ``currlen = i - st;``                ``if` `(maxlen < currlen)``                ``{``                ``maxlen = currlen;``                ``start = st;``                ``}``        ` `                ``// Next substring will start``                ``// after the last occurrence``                ``// of current character to avoid``                ``// its repetition.``                ``st = pos.get(str.charAt(i)) + ``1``;``            ``}``        ` `            ``// Update last occurrence of``            ``// current character.``            ``pos.replace(str.charAt(i), i);``        ``}``    ``}``    ` `    ``// Compare length of last``    ``// substring with maxlen and``    ``// update maxlen and start``    ``// accordingly.``    ``if` `(maxlen < i - st)``    ``{``        ``maxlen = i - st;``        ``start = st;``    ``}``    ` `    ``// The required longest``    ``// substring without``    ``// repeating characters``    ``// is from str[start]``    ``// to str[start+maxlen-1].``    ``return` `str.substring(start,``                         ``start +``                         ``maxlen);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``String str = ``"GEEKSFORGEEKS"``;``    ``System.out.print(findLongestSubstring(str));``}``}` `// This code is contributed by divyeshrabadiya07`

## Python3

 `# Python3 program to find and print longest``# substring without repeating characters.` `# Function to find and print longest``# substring without repeating characters.``def` `findLongestSubstring(string):` `    ``n ``=` `len``(string)` `    ``# starting point of current substring.``    ``st ``=` `0` `    ``# maximum length substring without``    ``# repeating characters.``    ``maxlen ``=` `0` `    ``# starting index of maximum``    ``# length substring.``    ``start ``=` `0` `    ``# Hash Map to store last occurrence``    ``# of each already visited character.``    ``pos ``=` `{}` `    ``# Last occurrence of first``    ``# character is index 0``    ``pos[string[``0``]] ``=` `0` `    ``for` `i ``in` `range``(``1``, n):` `        ``# If this character is not present in hash,``        ``# then this is first occurrence of this``        ``# character, store this in hash.``        ``if` `string[i] ``not` `in` `pos:``            ``pos[string[i]] ``=` `i` `        ``else``:``            ``# If this character is present in hash then``            ``# this character has previous occurrence,``            ``# check if that occurrence is before or after``            ``# starting point of current substring.``            ``if` `pos[string[i]] >``=` `st:` `                ``# find length of current substring and``                ``# update maxlen and start accordingly.``                ``currlen ``=` `i ``-` `st``                ``if` `maxlen < currlen:``                    ``maxlen ``=` `currlen``                    ``start ``=` `st` `                ``# Next substring will start after the last``                ``# occurrence of current character to avoid``                ``# its repetition.``                ``st ``=` `pos[string[i]] ``+` `1``            ` `            ``# Update last occurrence of``            ``# current character.``            ``pos[string[i]] ``=` `i``        ` `    ``# Compare length of last substring with maxlen``    ``# and update maxlen and start accordingly.``    ``if` `maxlen < i ``-` `st:``        ``maxlen ``=` `i ``-` `st``        ``start ``=` `st``    ` `    ``# The required longest substring without``    ``# repeating characters is from string[start]``    ``# to string[start+maxlen-1].``    ``return` `string[start : start ``+` `maxlen]` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:` `    ``string ``=` `"GEEKSFORGEEKS"``    ``print``(findLongestSubstring(string))` `# This code is contributed by Rituraj Jain`

## C#

 `// C# program to find``// and print longest substring``// without repeating characters.``using` `System;``using` `System.Collections.Generic;``class` `GFG{` `// Function to find and``// print longest substring``// without repeating characters.``public` `static` `String findlongestSubstring(String str)``{``  ``int` `i;``  ``int` `n = str.Length;` `  ``// Starting point``  ``// of current substring.``  ``int` `st = 0;` `  ``// length of``  ``// current substring.``  ``int` `currlen = 0;` `  ``// maximum length``  ``// substring without``  ``// repeating characters.``  ``int` `maxlen = 0;` `  ``// starting index of``  ``// maximum length substring.``  ``int` `start = 0;` `  ``// Hash Map to store last``  ``// occurrence of each` `  ``// already visited character.``  ``Dictionary<``char``,``             ``int``> pos = ``new` `Dictionary<``char``,``                                       ``int``>();` `  ``// Last occurrence of first``  ``// character is index 0;``  ``pos.Add(str, 0);` `  ``for` `(i = 1; i < n; i++)``  ``{``    ``// If this character is not present in hash,``    ``// then this is first occurrence of this``    ``// character, store this in hash.``    ``if` `(!pos.ContainsKey(str[i]))``    ``{``      ``pos.Add(str[i], i);``    ``}``    ``else``    ``{``      ``// If this character is present``      ``// in hash then this character``      ``// has previous occurrence,``      ``// check if that occurrence``      ``// is before or after starting``      ``// point of current substring.``      ``if` `(pos[str[i]] >= st)``      ``{``        ``// find length of current``        ``// substring and update maxlen``        ``// and start accordingly.``        ``currlen = i - st;``        ``if` `(maxlen < currlen)``        ``{``          ``maxlen = currlen;``          ``start = st;``        ``}` `        ``// Next substring will start``        ``// after the last occurrence``        ``// of current character to avoid``        ``// its repetition.``        ``st = pos[str[i]] + 1;``      ``}` `      ``// Update last occurrence of``      ``// current character.``      ``pos[str[i]] = i;``    ``}``  ``}` `  ``// Compare length of last``  ``// substring with maxlen and``  ``// update maxlen and start``  ``// accordingly.``  ``if` `(maxlen < i - st)``  ``{``    ``maxlen = i - st;``    ``start = st;``  ``}` `  ``// The required longest``  ``// substring without``  ``// repeating characters``  ``// is from str[start]``  ``// to str[start+maxlen-1].``  ``return` `str.Substring(start, ``                       ``maxlen);``}` `// Driver Code``public` `static` `void` `Main(String[] args)``{``  ``String str = ``"GEEKSFORGEEKS"``;``  ``Console.Write(findlongestSubstring(str));``}``}` `// This code is contributed by shikhasingrajput`

Output:

```EKSFORG

```

Time Complexity: O(n)
Auxiliary Space: O(n)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up