题目描述
给定字符串str1和str2,求str1的字串中含有str2所有字符的最小字符串长度。
输入描述:
输入包括两行,第一行一个字符串,代表str1,第二行也是一个字符串,代表str2。
输出描述:
输出str1的字串中含有str2所有字符的最小字符串长度,如果不存在请输出0。
示例1
输入
abcde
ac
输出
3
说明
“abc”中包含“ac”,且“abc”是所有满足条件中最小的。
示例2
输入
12345
344
输出
0
解法一:利用哈希表
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s1 = br.readLine();
String s2 = br.readLine();
int res = getRes(s1,s2);
System.out.println(res);
}
public static int getRes(String s1,String s2){
if(s1==null&&s2==null) return 0;
if(s1==null||s2==null) return 0;
if(s1.length()==0||s2.length()==0||s1.length()<s2.length()) return 0;
char[] arr = s1.toCharArray();
char[] p = s2.toCharArray();
int[] map = new int[256];
for(int i=0;i<p.length;i++){
map[p[i]]++;
}
int left = 0;
int right = 0;
int minLen = Integer.MAX_VALUE;
int match = p.length;
while(right!=arr.length){
map[arr[right]]--;
if(map[arr[right]]>=0){
match--;
}
if(match==0){
while(map[arr[left]]<0){
map[arr[left]]++;
left++;
}
minLen = Math.min(right-left+1,minLen);
match++;
map[arr[left++]]++;
}
right++;
}
return minLen==Integer.MAX_VALUE?0:minLen;
}
}