# Longest substring with atmost K characters from the given set of characters

Given a string **S**, an integer **K** and set of characters **Q[]**, the task is to find the longest substring in string **S** which contains atmost K characters from the given character set **Q[]**.

**Examples:**

Input:S = “normal”, Q = {“a”, “o”, “n”, “b”, “r”, “l”}, K = 1

Output:1

Explanation:

All the characters in the given string S are present in array.

Therefore, we can select any substring of length 1.

Input:S = “giraffe”, Q = {“a”, “f”, “g”, “r”}, K = 2

Output :3

Explanation:

Possible substrings with atmost 2 characters

From the given set are {“gir”, “ira”, “ffe”}

The maximum length of all the substrings is 3.

**Approach:** The idea is to use the concept of two pointers to consider the substrings of maximum length, such that it contains at most K character from the given set. Below is the illustration of the approach:

- Maintain two pointers
and**left**as 0, to consider the string in between these pointers.**right** - Increment the
pointer untill the characters from the given set is at most K.**right** - Update the longest length substring to be difference between the right pointer and left pointer.
cur_max = max(cur_max, right - left)

- Increment the
pointer and if the character which moved out from the two pointers is the character of the given set, then decrement the count of the characters from the set by 1.**left** - Similarly, repeat the steps above until the right pointer is not equal to the length of the string.

Below is the implmentation of the above approach:

## C++

`// C++ implementation to find the ` `// longest substring in the string ` `// which contains atmost K characters ` `// from the given set of characters ` ` ` `#include <bits/stdc++.h> ` ` ` `using` `namespace` `std; ` ` ` `// Function to find the longest ` `// substring in the string ` `// which contains atmost K characters ` `// from the given set of characters ` `int` `maxNormalSubstring(string& P, ` ` ` `set<` `char` `> Q, ` `int` `K, ` `int` `N) ` `{ ` ` ` ` ` `// Base Condition ` ` ` `if` `(K == 0) ` ` ` `return` `0; ` ` ` ` ` `// Count for Characters ` ` ` `// from set in substring ` ` ` `int` `count = 0; ` ` ` ` ` `// Two pointers ` ` ` `int` `left = 0, right = 0; ` ` ` `int` `ans = 0; ` ` ` ` ` `// Loop to iterate until ` ` ` `// right pointer is not ` ` ` `// equal to N ` ` ` `while` `(right < N) { ` ` ` ` ` `// Loop to increase the substring ` ` ` `// length until the characters from ` ` ` `// set are at most K ` ` ` `while` `(right < N && count <= K) { ` ` ` ` ` `// Check if current pointer ` ` ` `// points a character from set ` ` ` `if` `(Q.find(P[right]) != Q.end()){ ` ` ` ` ` `// If the count of the ` ` ` `// char is exceeding the limit ` ` ` `if` `(count + 1 > K) ` ` ` `break` `; ` ` ` `else` ` ` `count++; ` ` ` `} ` ` ` ` ` `right++; ` ` ` ` ` `// update answer with ` ` ` `// substring length ` ` ` `if` `(count <= K) ` ` ` `ans = max(ans, right - left); ` ` ` `} ` ` ` ` ` `// Increment the left pointer until ` ` ` `// the count is less than or equal to K ` ` ` `while` `(left < right) { ` ` ` `left++; ` ` ` ` ` `// If the charcter which comes out ` ` ` `// then decrment the count by 1 ` ` ` `if` `(Q.find(P[left]) != Q.end()) ` ` ` `count--; ` ` ` ` ` `if` `(count < K) ` ` ` `break` `; ` ` ` `} ` ` ` `} ` ` ` ` ` `return` `ans; ` `} ` ` ` `// Driver Code ` `int` `main() ` `{ ` ` ` `string P = ` `"giraffe"` `; ` ` ` `set<` `char` `> Q; ` ` ` ` ` `// Construction of set ` ` ` `Q.insert(` `'a'` `); ` ` ` `Q.insert(` `'f'` `); ` ` ` `Q.insert(` `'g'` `); ` ` ` `Q.insert(` `'r'` `); ` ` ` `int` `K = 2; ` ` ` `int` `N = P.length(); ` ` ` ` ` `// output result ` ` ` `cout << maxNormalSubstring(P, Q, K, N); ` ` ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## Python3

`# Python3 implementation to find the ` `# longest substring in the string ` `# which contains atmost K characters ` `# from the given set of characters ` ` ` `# Function to find the longest ` `# substring in the string ` `# which contains atmost K characters ` `# from the given set of characters ` `def` `maxNormalSubstring(P, Q, K, N): ` ` ` ` ` `# Base Condition ` ` ` `if` `(K ` `=` `=` `0` `): ` ` ` `return` `0` ` ` ` ` `# Count for Characters ` ` ` `# from set in substring ` ` ` `count ` `=` `0` ` ` ` ` `# Two pointers ` ` ` `left ` `=` `0` ` ` `right ` `=` `0` ` ` `ans ` `=` `0` ` ` ` ` `# Loop to iterate until ` ` ` `# right pointer is not ` ` ` `# equal to N ` ` ` `while` `(right < N): ` ` ` ` ` `# Loop to increase the substring ` ` ` `# length until the characters from ` ` ` `# set are at most K ` ` ` `while` `(right < N ` `and` `count <` `=` `K): ` ` ` ` ` `# Check if current pointer ` ` ` `# points a character from set ` ` ` `if` `(P[right] ` `in` `Q): ` ` ` ` ` `# If the count of the ` ` ` `# char is exceeding the limit ` ` ` `if` `(count ` `+` `1` `> K): ` ` ` `break` ` ` `else` `: ` ` ` `count ` `+` `=` `1` ` ` ` ` `right ` `+` `=` `1` ` ` ` ` `# update answer with ` ` ` `# substring length ` ` ` `if` `(count <` `=` `K): ` ` ` `ans ` `=` `max` `(ans, right ` `-` `left) ` ` ` ` ` `# Increment the left pointer until ` ` ` `# the count is less than or equal to K ` ` ` `while` `(left < right): ` ` ` `left ` `+` `=` `1` ` ` ` ` `# If the charcter which comes out ` ` ` `# then decrment the count by 1 ` ` ` `if` `(P[left] ` `in` `Q): ` ` ` `count ` `-` `=` `1` ` ` ` ` `if` `(count < K): ` ` ` `break` ` ` ` ` `return` `ans ` ` ` `# Driver Code ` `P ` `=` `"giraffe"` `Q ` `=` `{` `chr` `} ` ` ` `# Construction of set ` `Q.add(` `'a'` `) ` `Q.add(` `'f'` `) ` `Q.add(` `'g'` `) ` `Q.add(` `'r'` `) ` `K ` `=` `2` `N ` `=` `len` `(P) ` ` ` `# Output result ` `print` `(maxNormalSubstring(P, Q, K, N)) ` ` ` `# This code is contributed by Sanjit_Prasad ` |

*chevron_right*

*filter_none*

**Output:**

3

**Performance Analysis:**

**Time Complexity:**O(N)**Auxillary Space:**O(1)

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: **DSA Self Paced**. Become industry ready at a student-friendly price.

## Recommended Posts:

- Longest suffix such that occurrence of each character is less than N after deleting atmost K characters
- 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
- Length of the longest substring with consecutive characters
- Print Longest substring without repeating characters
- Length of the longest substring without repeating characters
- Longest substring with K unique characters using Binary Search
- Find length of longest substring with at most K normal characters
- Find the longest substring with k unique characters in a given string
- Count all sub-strings with weight of characters atmost K
- Largest substring with same Characters
- Maximum length substring having all same characters after k changes
- Largest substring where all characters appear at least K times | Set 2
- Searching characters and substring in a String in Java
- Find the String having each substring with exactly K distinct characters
- Minimum characters to be replaced to remove the given substring
- Minimum length substring with exactly K distinct characters
- Count of distinct characters in a substring by given range for Q queries
- Check if a substring can be Palindromic by replacing K characters for Q queries
- Maximum length prefix such that frequency of each character is atmost number of characters with minimum frequency

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.