Simplemente use la ventana deslizante para encontrar la primera posición que satisfaga la condición (límite izquierdo)
Cree dos mapas, uno para registrar los caracteres válidos reales requeridos y el otro para registrar el número de caracteres válidos en la ventana.
inicializarnecesidad
Cada vez que se atraviesa un carácter, se juzga si es un carácter válido. Si se actualiza la ventana, también se juzga si el número de caracteres válidos en la ventana es igual al número de caracteres válidos que se necesitan. Si es así actualizado válido
Cuando la longitud de la ventana es demasiado grande, es necesario reducir el límite para determinar si los caracteres en la ventana izquierda son caracteres válidos Actualizar ventana y ser válido.
Simplemente encuentra el primer límite izquierdo y regresa.
classSolution{
publicbooleancheckInclusion(String s1,String s2){
// 滑动窗口 找到第一个满足条件的位置即可Map<Character,Integer> need =newHashMap<>();Map<Character,Integer> window =newHashMap<>();// 初始化for(int i =0; i < s1.length();i++){
char c = s1.charAt(i);
need.put(c,need.getOrDefault(c,0)+1);}int left =0;int right =0;int valid =0;List<Integer> res =newArrayList<>();while(right < s2.length()){
// 判断当前字符是不是有效字符char c = s2.charAt(right);
right++;// 进行窗口内部数据更新 更新validif(need.containsKey(c)){
window.put(c,window.getOrDefault(c,0)+1);if(window.get(c).equals(need.get(c))){
valid++;// 更新有效字符个数}}// 判断是不是需要收缩while(right - left >= s1.length()){
if(valid == need.size()){
res.add(left);// 记录一个边界// break;returntrue;}char d = s2.charAt(left);
left++;if(need.containsKey(d)){
if(window.get(d).equals(need.get(d))){
valid--;}
window.put(d,window.get(d)-1);}}}returnfalse;}}