Para obtener la colección completa de LeetCode, consulte: Colección LeetCode Github
tema
Implementar strStr()
.
Devuelve el índice de la primera aparición de needle
en haystack
, o -1
si needle
no forma parte de haystack
.
Aclaración:
¿Qué debemos devolver cuando la aguja es un hilo vacío? Esta es una gran pregunta para hacer durante una entrevista.
A los efectos de este problema, devolveremos 0 cuando la aguja sea una cuerda vacía. Esto es consistente con strstr () de C y indexOf () de Java.
Ejemplo 1:
Input: haystack = "hello", needle = "ll"
Output: 2
Ejemplo 2:
Input: haystack = "aaaaa", needle = "bba"
Output: -1
Ejemplo 3:
Input: haystack = "", needle = ""
Output: 0
Restricciones:
0 <= haystack.length, needle.length <= 5 * 104
haystack and needle consist of only lower-case English characters.
1. Solución exhaustiva
Los dos bucles for pueden coincidir. El punto que es fácil pasar por alto aquí es juzgar si la aguja es una cuerda vacía ""
y, en caso afirmativo, devolver 0.
class Solution {
public int strStr(String haystack, String needle) {
// check null
if (haystack == null && needle == null) {
return 0;
}
if (haystack == null || needle == null) {
return -1;
}
int hlen = haystack.length();
int nlen = needle.length();
// check ""
if (nlen == 0) {
return 0;
}
for(int i = 0; i <= hlen - nlen; i++) {
for(int k = 0; k < nlen; k++) {
if (haystack.charAt(i + k) != needle.charAt(k)) {
break;
}
if (k == nlen - 1) {
return i;
}
}
}
return -1;
}
}
2. Escritura elegante
Suponiendo que las dos cadenas no estén vacías, puede utilizar la siguiente escritura elegante.
class Solution {
public int strStr(String haystack, String needle) {
for (int i = 0; ; i++) {
for (int k = 0; ; k++) {
if (k == needle.length()) return i;
if (i + k == haystack.length()) return -1;
if (haystack.charAt(i + k) != needle.charAt(k)) break;
}
}
}
}