Subcadena de cobertura mínima de algoritmo

Subcadena de cobertura mínima de algoritmo

1. Subcadena de cobertura mínima de algoritmo

Esta pregunta proviene de: La dificultad LeetCode-76 es difícil.

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:

如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。

El tema es fácil de entender. Traducido a la lengua vernácula es encontrar una subcadena que contenga todos los elementos en la cadena T y la longitud más pequeña en la cadena S.

1. Tenga en cuenta que no tenemos ningún requisito sobre el orden de las cadenas en este tema. Para reducir la complejidad, podemos usar tablas hash para representar las cadenas S y T. Entre ellos, map1 representa la cadena T y map2 representa la subcadena de la cadena S que contiene la cadena T.
2. Cuando el número de un carácter c que aparece en map2 es igual al número de carácter c que aparece en map1, se completa una coincidencia.
3. Cuando se completa toda la coincidencia, obtenemos un resultado coincidente.
4. Compare el tamaño de la ventana. Si la ventana actual es más pequeña que la ventana anterior, actualice la ventana.
5. De lo contrario, ajuste el elemento de la ventana izquierda. Si la subcadena de destino tiene el elemento de la ventana izquierda, entonces reduzca el número de elementos de la ventana izquierda. Si el elemento c en la ventana es El número es menor que el número del elemento c en la subcadena de destino, entonces el número de coincidencias es -1.
6. Si se incluye el elemento de la ventana izquierda, la ventana continúa deslizándose

    public String minWindow(String s, String t) {
    
    
        int[] map=new int[128];
        int[] tempMap=new int[128];
        char[] cs=s.toCharArray();
        char[] ts=t.toCharArray();
        int noDupCount=0;
        for (char c:ts){
    
    
            map[c]++;
            if(map[c]==1){
    
    
                noDupCount++;
            }
        }
        int left=0,right=0;
        int matchCount=0;
        int start=0;
        int minLen=Integer.MAX_VALUE;
        while (right<cs.length){
    
    
            char c=cs[right];
            if(map[c]>0){
    
    
                tempMap[c]++;
                if(map[c]==tempMap[c]){
    
    
                    matchCount++;
                }
            }
            right++;
            while (matchCount==noDupCount){
    
    
                if(right-left<minLen){
    
    
                    start=left;
                    minLen=right-left;
                }
                char cc=cs[left];
                if(map[cc]>0){
    
    
                    tempMap[cc]--;
                    if(tempMap[cc]<map[cc]){
    
    
                        matchCount--;
                    }
                }
                left++;
            }
        }
        return minLen==Integer.MAX_VALUE?"":s.substring(start,start+minLen);
    }

Supongo que te gusta

Origin blog.csdn.net/qq_23594799/article/details/107299076
Recomendado
Clasificación