public static String window(String str, String pat){
int n1=str.length();
int n2=pat.length();
if(n2>n1){
return "No String";
}
HashMap<Character,Integer> strhm=new
HashMap<Character,Integer>();
HashMap<Character,Integer> pathm=new
HashMap<Character,Integer>();
for(int i=0;i<n2;i++){
char c=pat.charAt(i);
if(pathm.containsKey(c)){
int temp=pathm.get(c);
pathm.put(c,temp+1);
}
else{
pathm.put(c,1);
}
}
int start=0, start_index=-1, min_len=Integer.MAX_VALUE, count=0;
for(int i=0;i<n1;i++){
char c=str.charAt(i);
if(strhm.containsKey(c)){
int temp=strhm.get(c);
strhm.put(c,temp+1);
}
else{
strhm.put(c,1);
}
if(pathm.containsKey(c)&&strhm.get(c)<=pathm.get(c)){
count++;
}
if(count==n2){
while(!pathm.containsKey(str.charAt(start))||pathm.containsKey(str.charAt(start))&&strhm.get(str.charAt(start))>pathm.get(str.charAt(start))){
if(pathm.containsKey(str.charAt(start))&&strhm.get(str.charAt(start))>pathm.get(str.charAt(start))){
int tval=strhm.get(str.charAt(start));
strhm.put(str.charAt(start),tval-1);
}
start++;
}
int len_win=i-start+1;
if(min_len>len_win){
min_len=len_win;
start_index=start;
}
}
}
if(start_index==-1){
return "No String";
}
else{
return str.substring(start_index,min_len+start_index+1);
}
}