Given a string str, find the length of the longest substring without repeating characters.
- For “ABDEFGABEF”, the longest substring are “BDEFGA” and “DEFGAB”, with length 6.
- For “BBBB” the longest substring is “B”, with length 1.
- For “GEEKSFORGEEKS”, there are two longest substrings shown in the below diagrams, with length 7
The desired time complexity is O(n) where n is the length of the string.
Method 1 (Simple): We can consider all substrings one by one and check for each substring whether it contains all unique characters or not. There will be n*(n+1)/2 substrings. Whether a substring contains all unique characters or not can be checked in linear time by scanning it from left to right and keeping a map of visited characters. Time complexity of this solution would be O(n^3).
Method 2 (Linear Time): Let us talk about the linear time solution now. This solution uses extra space to store the last indexes of already visited characters. The idea is to scan the string from left to right, keep track of the maximum length Non-Repeating Character Substring (NRCS) seen so far. Let the maximum length be max_len. When we traverse the string, we also keep track of the length of the current NRCS using cur_len variable. For every new character, we look for it in already processed part of the string (A temp array called visited is used for this purpose). If it is not present, then we increase the cur_len by 1. If present, then there are two cases:
- The previous instance of character is not part of current NRCS (The NRCS which is under process). In this case, we need to simply increase cur_len by 1.
- If the previous instance is part of the current NRCS, then our current NRCS changes. It becomes the substring starting from the next character of the previous instance to currently scanned character. We also need to compare cur_len and max_len, before changing current NRCS (or changing cur_len).
Below is the implementation of the above approach :
The input string is ABDEFGABEF The length of the longest non-repeating character substring is 6
Time Complexity: O(n + d) where n is length of the input string and d is number of characters in input string alphabet. For example, if string consists of lowercase English characters then value of d is 26.
Auxiliary Space: O(d)
As an exercise, try the modified version of the above problem where you need to print the maximum length NRCS also (the above program only prints the length of it).
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
- Print Longest substring without repeating characters
- Longest repeating and non-overlapping substring
- Longest substring such that no three consecutive characters are same
- Longest substring of only 4's from the first N characters of the infinite string
- Maximum length substring having all same characters after k changes
- Length of the longest substring with equal 1s and 0s
- Longest Even Length Substring such that Sum of First and Second Half is same
- Length of the longest valid substring
- Length of the longest substring that do not contain any palindrome
- Find the longest substring with k unique characters in a given string
- Minimum length substring with exactly K distinct characters
- Length of the longest substring with no consecutive same letters
- Find length of longest subsequence of one string which is substring of another string
- Length of the largest substring which have character with frequency greater than or equal to half of the substring
- Longest Repeating Subsequence