# Find the smallest window in a string containing all characters of another string

0
1053

## Given two strings s and t, write a function that will find the minimum window in s which will contain all the characters of t

### Example 1

INPUT
S = “tutorial cup”
T = “oti”

Example 2

INPUT
T = “zsk”

### OUTPUT Minimum window is “skz”

Method 1(Brute Force)

1. Generate all the substrings of string S

2. For every substring of S, check whether the substring contains all characters of string T

3. Print the least length substring which conatins all characters of string T

### Method 2(Efficient)

Time Complexity : O(n)

## Algorithm

1. If the length of string S is less than string T, then print “NO such window exists”. Else,

2. Build a count array T_count[] of string T
ie, for example 2
count of z is 1, so T_count[‘z’] = 1
count of s is 1, so T_count[‘s’] = 1
count of k is 1, so T_count[‘k’] = 1

3. Traverse the string S, while traversing

Â Â  a. count occurences of characters of string S
ie, S_count[‘z’] = 1, when we are at first character of string S
S_count[‘a’] = 1, when we are at second character of string S

Â Â Â  b. If string S char matches with string T’s char, then increment the count variable
ie, for example 2
First char in string S ie, char ‘z’, there is also a char ‘z’ in string T. so increament count ie, count = 1.

Â Â Â  c. If the count is same as the length of the T string, then we found the window
ie,for example 2
At char ‘k’ in string S count becomes 3( same as length of string T). Therefore we found the window ie, from starting character to present characterÂ  “zaask”

Â  d. After finding the window, now try to minimize it by removing extra characters from beginning of current window
ie,for example 2
After we find the second occurence of char ‘z’ in string S. ie, S_count[‘z’] changes from 1 to

2. Which is greater thanÂ  T_count[‘z’]. It means that the window contains more number of ‘z’s than it needed so remove first ‘z’ and other useless characters from starting. ie, now window becomes “skz”

e. update the start and minimum length of the window ie, start changes from ‘z’ to ‘s’ and Â Â Â  min_length changes from 5 to 3

f. Print the minimum length window

## C++ Program

``````#include<bits/stdc++.h>
#define NO_OF_CHARS 256
using namespace std;

// Function to find smallest window containing
// all characters of T
string findSubString(string S, string T)
{
int Slen = S.length();
int Tlen = T.length();

// check if string's length is less than T's
// length. If yes then no such window can exist
if (Slen < Tlen)
{
cout << "No such window exists";
return "";
}

int S_count[NO_OF_CHARS] = {0};
int T_count[NO_OF_CHARS] = {0};

// store occurrence of characters of 't'
for (int i = 0; i < Tlen; i++)
T_count[T[i]]++;

int start = 0, start_index = -1, min_len = INT_MAX;

// start traversing the string
int count = 0;  // count of characters
for (int i = 0; i < Slen ; i++)
{
// count occurrence of characters of string
S_count[S[i]]++;

// If s's char matches with t's char
// then increment count
if (T_count[S[i]] != 0 &&
S_count[S[i]] <= T_count[S[i]] )
count++;

// if all the characters are matched
if (count == Tlen)
{
//minimizng the current window
//If the current window has a character which occured more number of times
//than the character in T string, then remove starting chars
while ( S_count[S[start]] > T_count[S[start]]
|| T_count[S[start]] == 0)
{

if (S_count[S[start]] > T_count[S[start]])
S_count[S[start]]--;
start++;
}

// update window size
int len_window = i - start + 1;
if (min_len > len_window)
{
min_len = len_window;
start_index = start;
}
}
}

// If no window found
if (start_index == -1)
{
cout << "No such window exists";
return "";
}

// Return substring starting from start_index
// and length min_len
return S.substr(start_index, min_len);
}

int main()
{
string S = "tutorial cup";
string T = "oti";

cout << "Smallest window is : "<< findSubString(S, T)<<endl;
return 0;
}``````