Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Minimum Window Subsequence in C++
Suppose we have two strings S and T, we have to find the minimum substring W of S, so that T is a subsequence of W. If there is no such window in S that covers all characters in T, then return empty string. If there are multiple such windows, we have to return the one with the left-most starting index.
So, if the input is like S = "abcdebdde", T = "bde", then the output will be "bcde" as it occurs before "bdde". "deb" is not a smaller window because the elements of T in the window must occur in order.
To solve this, we will follow these steps −
tidx := 0, tlen := size of T
n := size of S
i := 0, length := inf, start := -1
-
while i < n, do −
-
if S[i] is same as T[tidx], then −
(increase tidx by 1)
-
if tidx is same as tlen, then −
end := i + 1
(decrease tidx by 1)
-
while tidx >= 0, do −
-
if S[i] is same as T[tidx], then −
(decrease tidx by 1)
(decrease i by 1)
-
(increase i by 1)
(increase tidx by 1)
-
if end - i < length, then −
length := end - i
start := i
(increase i by 1)
-
-
if start is not equal to -1, then −
-
for initialize i := start, when i < start + length, update (increase i by 1), do −
ret := ret + S[i]
-
return ret
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string minWindow(string S, string T) {
int tidx = 0;
int tlen = T.size();
int n = S.size();
int i = 0;
int length = INT_MAX;
int start = -1;
string ret;
while (i < n) {
if (S[i] == T[tidx]) {
tidx++;
if (tidx == tlen) {
int end = i + 1;
tidx--;
while (tidx >= 0) {
if (S[i] == T[tidx]) {
tidx--;
}
i--;
}
i++;
tidx++;
if (end - i < length) {
length = end - i;
start = i;
}
}
}
i++;
}
if (start != -1)
for (int i = start; i < start + length; i++)
ret += S[i];
return ret;
}
};
main(){
Solution ob;
cout << (ob.minWindow("abcdebdde", "bde"));
}
Input
"abcdebdde", "bde"
Output
"bcde"