Open In App

Python - Longest Substring Length of K

Last Updated : 16 May, 2023
Suggest changes
Share
Like Article
Like
Report

Given a String and a character K, find longest substring length of K.

Input : test_str = 'abcaaaacbbaa', K = b 
Output : 2 
Explanation : b occurs twice, 2 > 1. 

Input : test_str = 'abcaacccbbaa', K = c 
Output : 3 
Explanation : Maximum times c occurs is 3.

Method #1: Using loop

This is brute way to solve this problem, in this, when K is encountered, counter is maintained till other character occurs, and count is noted, the maximum of these counts is kept and is returned as result.

Python3
# Python3 code to demonstrate working of  # Longest Substring of K # Using loop # initializing string test_str = 'abcaaaacbbaa' # printing original String print("The original string is : " + str(test_str)) # initializing K  K = 'a' cnt = 0 res = 0 for idx in range(len(test_str)): # increment counter on checking if test_str[idx] == K: cnt += 1 else: cnt = 0 # retaining max res = max(res, cnt) # printing result  print("The Longest Substring Length : " + str(res)) 

Output
The original string is : abcaaaacbbaa The Longest Substring Length : 4

Method #2: Using findall() + max()

In this, we get all the possible substrings of K using findall() and max() is used over it to get maximum length with len as key.

Python3
# Python3 code to demonstrate working of  # Longest Substring of K # Using findall() + max() import re # initializing string test_str = 'abcaaaacbbaa' # printing original String print("The original string is : " + str(test_str)) # initializing K  K = 'a' # getting all substrings res = re.findall(r'' + K + '+', test_str) # getting maximum of substrings Length res = len(max(res, key = len)) # printing result  print("The Longest Substring Length : " + str(res)) 

Output
The original string is : abcaaaacbbaa The Longest Substring Length : 4

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

Method #3:  Using itertools.groupby

Step-by-step Algorithm:

  1. Use itertools.groupby() to group characters in test_str by their values
  2. Filter out the groups where the character is not equal to K
  3. Generate a list of lengths of all remaining groups using list comprehension
  4. Return the maximum value in the list using max()
Python3
# Importing itertools module import itertools # Initializing input string and the character to be searched test_str = 'abcaaaacbbaa' K = 'a' # printing the original string print("The original string is : " + str(test_str)) # Using groupby() function to group the characters of the string res = max([len(list(grp)) for char, grp in itertools.groupby(test_str) if char == K]) # Printing the result print("The Longest Substring Length : " + str(res)) 

Output
The original string is : abcaaaacbbaa The Longest Substring Length : 4

Time complexity: O(n) where n is the length of the input string test_str
Space complexity: O(1)

Method #4: Using generator expression, max() and re.split() function

  • Importing the re module
  • The test_str variable is initialized with the given string.
  • re.split() is used to split the string by every character except K, using a regular expression.
  • A generator expression is used to get the length of each substring generated by re.split().
  • max() function is used to get the maximum length of the substrings.
  • Printing the result.
Python3
import re # initializing string test_str = 'abcaaaacbbaa' # printing original String print("The original string is : " + str(test_str)) # initializing K K = 'a' # Using generator expression, max() and re.split() function res = max(len(sub_str) for sub_str in re.split(f'[^{K}]', test_str)) # printing result print("The Longest Substring Length : " + str(res)) 

Output
The original string is : abcaaaacbbaa The Longest Substring Length : 4

Time complexity: O(n) where n is the length of the input string test_str
Space complexity: O(n) where n is the length of the input string test_str

Method 5: Using Regular expression and max()

  • Import the re module which provides support for regular expressions.
  • Define the input string and the character to be searched for.
  • Use re.findall() method to find all the occurrences of the character in the string.
  • Use the max() function to find the longest substring of the character by comparing the lengths of all the substrings obtained from step 3.
  • Print the length of the longest substring obtained in step 4.
Python3
# Python3 code to demonstrate working of  # Longest Substring of K # Using Regular expression and max() # importing regular expression module import re # initializing string test_str = 'abcaaaacbbaa' # printing original String print("The original string is : " + str(test_str)) # initializing K  K = 'a' # find all occurrences of the character matches = re.findall(K + '+', test_str) # find the length of the longest substring res = len(max(matches, key=len)) # printing result  print("The Longest Substring Length : " + str(res)) 

Output
The original string is : abcaaaacbbaa The Longest Substring Length : 4

Time complexity: O(n) where n is the length of the input string, as we need to traverse the string only once.
Auxiliary space: O(n) for storing the matches found using re.findall().

Method 6: Using numpy:

Step-by-step approach:

  • Create a numpy array from the input string.
  • Use the np.where() function to find the indices where the character K appears in the array.
  • Use the np.diff() function to calculate the consecutive differences between the indices found in step 2.
  • Use the np.max() function to find the maximum consecutive difference, which gives the length of the longest
  • substring of the character K.
  • Return the result.
Python3
import numpy as np # Initializing input string and the character to be searched test_str = 'abcaaaacbbaa' K = 'a' # creating a numpy array from the input string arr = np.array(list(test_str)) # finding the indices where the character K appears indices = np.where(arr == K)[0] # finding the consecutive differences between indices differences = np.diff(indices) # finding the maximum consecutive difference res = np.max(differences) # printing the original string and the result print("The original string is : " + str(test_str)) print("The Longest Substring Length : " + str(res)) #This code is contributed by Rayudu. 
Output: The original string is : abcaaaacbbaa The Longest Substring Length : 4

Time Complexity:

Creating a numpy array from the input string takes O(n) time, where n is the length of the input string.
The np.where() function takes O(n) time to find the indices where the character K appears in the array.
The np.diff() function takes O(m) time, where m is the number of indices where the character K appears in the array.
The np.max() function takes O(m) time to find the maximum consecutive difference.
Therefore, the overall time complexity of the algorithm is O(n + m).

Auxiliary Space:

Creating a numpy array from the input string takes O(n) space, where n is the length of the input string.
The np.where() function returns an array of size m, where m is the number of indices where the character K appears in the array.
The np.diff() function creates a new array of size m-1.
Therefore, the overall space complexity of the algorithm is O(n + m).

Method #7: Using dynamic programming

Step-by-step approach:

  • Initialize a 1D array dp of length n, where dp[i] represents the length of the longest substring of the input string that ends at index i.
  • Initialize dp[0] to 1 if the first character of the input string is 'a', otherwise set it to 0.
  • Iterate over the characters in the input string starting from index 1. If the current character is equal to the target character 'a', set dp[i] to dp[i-1] + 1. Otherwise, set dp[i] to 0.
  • Keep track of the maximum value in the dp array.
  • Return the maximum value in the dp array as the length of the longest substring.
Python3
# initializing string test_str = 'abcaaaacbbaa' # printing original String print("The original string is : " + str(test_str)) # initializing K K = 'a' # Using dynamic programming n = len(test_str) dp = [0] * n dp[0] = 1 if test_str[0] == K else 0 for i in range(1, n): if test_str[i] == K: dp[i] = dp[i-1] + 1 else: dp[i] = 0 max_count = max(dp) # printing result print("The Longest Substring Length : " + str(max_count)) 

Output
The original string is : abcaaaacbbaa The Longest Substring Length : 4

Time complexity: O(n), where n is the length of the input string.
Auxiliary space: O(n), as we are using a 1D array dp of length n to store the lengths of the longest substrings ending at each index of the input string.


Similar Reads

Practice Tags :