[Ventana corredera] LCR 014. Disposición de cuerdas

LCR 014. Disposición de cuerdas

Ideas para resolver problemas

  • 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.
class Solution {
    
    
    public boolean checkInclusion(String s1, String s2) {
    
    
        // 滑动窗口  找到第一个满足条件的位置即可
        Map<Character,Integer> need = new HashMap<>();
        Map<Character,Integer> window  = new HashMap<>();

        // 初始化
        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  = new ArrayList<>();

        while(right < s2.length()){
    
    
            // 判断当前字符是不是有效字符
            char c = s2.charAt(right);
            right++;

            // 进行窗口内部数据更新 更新valid
            if(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;
                    return true;
                }

                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);
                }
            }
        }

        return false;

    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_44653420/article/details/132940572
Recomendado
Clasificación