¡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
yp
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 p
las y luego atravesar la cadena s
, comenzando desde i
la , para verificar s[i]、s[i + 1]...s[i + p.length]
si la cadena es un anagrama p
de la cadena y, de ser así, convertir la letra en el anagrama. El índice inicial del término se i
agrega 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 26
una , llénela 0
y 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 p
se completa el mapeo , obtenemos la p
matriz 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;
}
复制代码
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:
p
Realice una asignación de matriz de letras en la cadena y la matriz asignada escount
.- Atraviesa la cadena
s
, inicializa unleft
puntero y unright
puntero, que representa el principio y el final de cada cadena. - Vamos a
count[s[right].chatCodeAt()-'a.charCodeAt()']
restar1
, lo que significa compensar una letra. Si aparece un número negativo, significa que no es un anagrama y debe restablecersecount
al estado original. Si es un anagrama, el valor correspondiente decount
todos los subíndices debe ser 0 cuando se reduce al final , yright - left - 1 === n
el subíndice inicial seleft
agrega a la matriz de resultados. - 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;
};
复制代码