characterReplacement: el carácter repetido más largo después del reemplazo

Descripción del Título

Le da una cadena que consta solo de letras mayúsculas en inglés. Puede reemplazar el carácter en cualquier posición con otro carácter, y puede reemplazarlo hasta k veces en total. Después de realizar las operaciones anteriores, encuentre la longitud de la subcadena más larga que contiene letras repetidas.

Nota: La longitud de la cuerda yk no excederá de 104.

Ejemplo 1:

Entrada: s = "ABAB", k = 2
Salida: 4
Explicación: Reemplace dos A por dos B y viceversa.

Ejemplo 2:

Entrada: s = "AABABBA", k = 1
Salida: 4
Explicación:
Reemplace la "A" del medio por "B", y la cadena se convierte en "AABBBBA".
La subcadena "BBBB" tiene la letra repetida más larga y la respuesta es 4.

Temas relacionados Ventana deslizante de dos punteros

Ideas para resolver problemas

He hecho una pregunta similar antes, para encontrar la cadena repetida más larga, usando un puntero doble, derecha-izquierda, y almacenada en un campo reservado max, donde max es el tamaño de la ventana. La ventana solo se actualizará cuando max sea actualizado. Hazte más grande.
1. El tamaño mínimo de la ventana es k + 1 (generalmente)
2. La definición de la ventana es la mayor cantidad de elementos en la
ventana + k 3. La ventana se desliza, y la actualización de la ventana no se cumple, y la ventana continúa deslice hacia la derecha. En este momento, la ventana general se desplaza
4. La ventana se actualiza, qué elemento es el elemento más agregado

Demostración de código

class Solution {
    
    
    public int characterReplacement(String s, int k) {
    
    
        //字符串的长度小于k,则返回的结果必定是s,因为都可以被替换
            if(s.length()<=k+1)
                return s.length();
            //0-A,25-Z 用来存放窗口内各个字母的数量
            int[] map=new int[26];
        char[] chars = s.toCharArray();
        int left=0,right;
        int max=0;
        for(right=0;right<s.length();right++)
        {
    
    
            //变量index存放字符的索引值
            int index=chars[right]-'A';
            //当前窗口内,该字母数量+1;
            map[index]++;
            //更新窗口内最多的字母数量
            max=Math.max(max,map[index]);
            //新增的数加入到窗口,不满足可以更新窗口的条件
            //窗口向左平移
            if(right-left+1>max+k)
            {
    
    
                //只要平移,窗内就会少一个元素,这个对应元素的数量不纳入窗内数量的统计,将数量-1;
                map[chars[left]-'A']--;
                left++;
            }

        }
         //窗户到达左右边的时候,此时的right为s.length();
        return right-left;
    }
}

resultado de ejecución

La
respuesta de información fue exitosa:
tiempo de ejecución: 6 ms, derrotando al 60.54% de los usuarios de Java
Consumo de memoria: 38.8 MB, derrotando al 8.85% de los usuarios de Java

Supongo que te gusta

Origin blog.csdn.net/tangshuai96/article/details/113540778
Recomendado
Clasificación