Tocar el balde y salir corriendo - LeetCode438. Encuentra todos los anagramas de letras en la cadena

¡Continúe creando, acelere el crecimiento! Este es el 7º día de mi participación en el "Nuevo plan diario de los Nuggets · Desafío de actualización de octubre", haz clic para ver los detalles del evento

Tema Descripción

Dadas dos cadenas  s y p, busque  s todas las  subcadenas p de  anagramas  en y devuelva los índices iniciales de estas subcadenas. No se tiene en cuenta el orden en que se emiten las respuestas.

Las palabras atópicas se refieren a cadenas formadas al reorganizar las mismas letras (incluidas cadenas idénticas).

Ejemplo 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
复制代码

Ejemplo 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
复制代码

insinuación:

  • 1 <= s.length, p.length <= 3 * 104
  • s y  p solo minúsculas

Ideas para resolver problemas

Un anagrama significa una cadena de igual longitud y el mismo número de letras.

Un método simple es contar plas y luego atravesar la cadena s, comenzando desde ila , para verificar s[i]、s[i + 1]...s[i + p.length]si la cadena es un anagrama pde la cadena y, de ser así, convertir la letra en el anagrama. El índice inicial del término se iagrega a la matriz de resultados.

Entonces, ¿cómo se deben usar las estadísticas?

Al principio usábamos objetos para contar cada cadena, pero esto era demasiado lento y se agotaba el tiempo de espera.

Por lo tanto, el método de mapeo de matrices se usa más adelante. Inicialice 26una , llénela 0y un índice representa una letra (según el código ASCII), por ejemplo, el índice 'a'correspondiente a es 'a'.charAtCode() - 'a'.charAtCode(), es decir 0, y así sucesivamente.

Luego, cuando pse completa el mapeo , obtenemos la pmatriz de mapeo de, por ejemplo p=aab, entonces la matriz de mapeo es [2,1,0,0,....0] 21 (24 0s).

Cuando cada cadena se atraviesa posteriormente, se realiza un mapeo. Si es un anagrama, los valores de los índices correspondientes son los mismos Aquí, simplemente puede usar el toString()método para comparar si los valores de las dos matrices son iguales después de convertirlos en cadenas.

responder

/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
var findAnagrams = function(s, p) {
    const ans = [], lens = p.length, mp = trans(p);

    for(let i=0, l = s.length; i<l; ++i) {
        if(trans(s.substr(i, lens).split('')).toString() === mp.toString()) {
            ans.push(i);
        } 
    }
    return ans;
};

const trans = (p) => {
    const mp = new Array(26).fill(0);
    for(const w of p) {
        mp[w.charCodeAt() - 'a'.charCodeAt()]++;
    }
    return mp;
}
复制代码

capturar.PNG

Ideas para resolver problemas

En el método 1, cada recorrido se realiza en cada cadena s.substr(i, lens).split('')para comparar el número de letras, lo que requiere mucho tiempo. De hecho, cuando estamos atravesando, podemos usar la resta para hacerlo.

Nuevamente este concepto: si dos cadenas son anagramas, su número y longitud deben ser iguales .

Los pasos específicos son los siguientes:

  1. pRealice una asignación de matriz de letras en la cadena y la matriz asignada es count.
  2. Atraviesa la cadena s, inicializa un leftpuntero y un rightpuntero, que representa el principio y el final de cada cadena.
  3. Vamos a count[s[right].chatCodeAt()-'a.charCodeAt()']restar 1, lo que significa compensar una letra. Si aparece un número negativo, significa que no es un anagrama y debe restablecerse countal estado original. Si es un anagrama, el valor correspondiente de counttodos los subíndices debe ser 0 cuando se reduce al final , y right - left - 1 === nel subíndice inicial se leftagrega a la matriz de resultados.
  4. repita el paso 3

responder

/**
 * @param {string} s
 * @param {string} p
 * @return {number[]}
 */
var findAnagrams = function(s, p) {
    const ans = [], count = new Array(26).fill(0), m = s.length, n = p.length;
    for(const w of p) {
        ++count[w.charCodeAt() - 'a'.charCodeAt()];
    }
    for(let l=0, r=0; r<m; ++r) {
        --count[s[r].charCodeAt() - 'a'.charCodeAt()];
        while(count[s[r].charCodeAt() - 'a'.charCodeAt()] < 0) {
            ++count[s[l].charCodeAt() - 'a'.charCodeAt()];
            l++;
        }
        if(r - l + 1 === n) {
            ans.push(l);
        }
    }
    return ans;
};
复制代码

capturar.PNG

Supongo que te gusta

Origin juejin.im/post/7150320640292028446
Recomendado
Clasificación