A substring is a continuous part of a string. A subsequence is the part of a string that might be continuous or not but the order of the elements is maintained. For example, given the string atpaaabpabtt
, pabt
is a substring, while pat
is a subsequence.
Now given a string S and a subsequence P, you are supposed to find the shortest substring of S that contains P. If such a solution is not unique, output the left most one.
Input Specification:
Each input file contains one test case which consists of two lines. The first line contains S and the second line P. S is non-empty and consists of no more than 104 lower English letters. P is guaranteed to be a non-empty subsequence of S.
Output Specification:
For each case, print the shortest substring of S that contains P. If such a solution is not unique, output the left most one.
Sample Input:
atpaaabpabttpcat
pat
Sample Output:
pabt
#include<iostream>
using namespace std;
string s,p;
int min_start,min_len;
void dfs(int j,int i,int s_start){
if(j==p.size()){
if(min_len>i-s_start){
min_len = i-s_start;
min_start = s_start;
}
return;
}
if(i>=s.size()||i-s_start>=min_len)return;
while(i<s.size()&&s[i]!=p[j])i++;
if(i<s.size()){
dfs(j+1,i+1,s_start);
}
}
int main(){
cin>>s>>p;
int l,r;
int start = 0;
min_len =s.size()+1;
for(start = 0;start+p.size()<s.size();start++){
if(s[start]==p[0]) dfs(1,start+1,start);
}
cout<<s.substr(min_start,min_len)<<endl;
}