Dadas 2 cadenas como bangalore y blr, devuelve si una aparece como una subsecuencia de la otra. El caso anterior devuelve cierto, mientras que bangalore y brl devuelven falso.Ocurrencia de secuencia secundaria en una cadena
Respuesta
La estrategia codiciosa debería funcionar para este problema.
- Encuentra la primera letra de la subcadena sospecha (BLR) en la gran cadena (* b * angalore)
- encontrar la segunda carta a partir del índice de la primera letra más uno (anga * l * mineral)
- Encuentra la tercera letra que comienza en el índice de la segunda letra más una (o * r * e)
- Continúa hasta que no puedas encontrar la siguiente letra de blr en la cadena (no coincide), o quedarse sin letras en la subsecuencia (tiene una coincidencia).
Aquí es un ejemplo de código en C++:
#include <iostream>
#include <string>
using namespace std;
int main() {
string txt = "quick brown fox jumps over the lazy dog";
string s = "brownfoxzdog";
int pos = -1;
bool ok = true;
for (int i = 0 ; ok && i != s.size() ; i++) {
ok = (pos = txt.find(s[i], pos+1)) != string::npos;
}
cerr << (ok ? "Found" : "Not found") << endl;
return 0;
}
Supongo que no es posible en mejor que O (n)? –
@princessofpersia No, no sin preprocesamiento. Si tiene un texto grande y necesita consultarlo en busca de subcadenas, creo que puede optimizarlo de alguna manera: para cada letra del alfabeto, almacene una lista ordenada de sus ocurrencias en el texto. Luego puede hacer su búsqueda en 'O (K * logN)', donde 'K' es el número de letras en la subcadena, y' N' es el número de letras en el texto. – dasblinkenlight
logN para la búsqueda binaria de la cadena? –
encontrar la longitud de la longest common subsequence. Si es igual a la longitud de pequeña cadena, solución verdadera
¡Es como tomar un mazo para matar una mosca! LCS es O (N * M), será más lento que codicioso, especialmente cuando no hay coincidencia. – dasblinkenlight
Sí, tienes razón. – MBo
// Solution 1
public static boolean isSubSequence(String str1, String str2) {
int i = 0;
int j = 0;
while (i < str1.length() && j < str2.length()) {
if (str1.charAt(i) == str2.charAt(j)) {
i++;
j++;
} else {
i++;
}
}
return j == str2.length();
}
// Solution 2 using String indexOf method
public static boolean isSubSequenceUsingIndexOf(String mainStr, String subStr) {
int i = 0;
int index = 0;
while(i<subStr.length()) {
char c = subStr.charAt(i);
if((index = mainStr.indexOf(c, index)) == -1) {
return false;
}
i++;
}
return true;
}
O (N) de regreso, donde N es la longitud de la subcadena.
bool subsequence(string s1, string s2){
int n1 = s1.length();
int n2 = s2.length();
if(n1 > n2){
return false;
}
int i = 0;
int j = 0;
while(i < n1 && j < n2){
if(s1[i] == s2[j]){
i++;
}
j++;
}
return i == n1;
}
- 1. Contando la ocurrencia más larga de secuencia repetida en Python
- 2. Eliminar una fila secundaria y una secundaria con una secuencia de comandos SQL
- 3. Separar una cadena en el primer espacio de ocurrencia blanco
- 4. Buscar Nth ocurrencia de un carácter en una cadena
- 5. tsql última "ocurrencia de" dentro de una cadena
- 6. XSLT: Encontrar la última ocurrencia de una cadena
- 7. PHP ¿Reemplazar la última ocurrencia de una cadena en una cadena?
- 8. Separar una cadena de la segunda ocurrencia del carácter
- 9. Split en ocurrencia solo separador
- 10. Romper una cadena aparte en una secuencia de palabras
- 11. expresión regular que concuerda la última ocurrencia de punto en una cadena
- 12. XSLT 1.0 - Encontrar la última ocurrencia y tomando cadena antes
- 13. cadena concat en una secuencia de comandos shell
- 14. Escribir cadena en la secuencia de salida
- 15. ¿Cómo puedo generar una secuencia a partir de una cadena?
- 16. cómo reemplazar la última ocurrencia de una palabra en javascript?
- 17. Encontrar la secuencia repetitiva más larga en una cadena
- 18. ¿Cómo uso una cadena como secuencia en .Net?
- 19. ¿Ves la secuencia de bytes exacta de una cadena R?
- 20. Creando una secuencia FILE * que da como resultado una cadena
- 21. cómo obtener una lista secundaria de una lista en ocaml
- 22. Sobrecarga de una función virtual en una clase secundaria
- 23. ¿Cómo convertir una cadena a secuencia de caracteres?
- 24. coincidencia de cadena de ocurrencia más a la derecha en MySQL
- 25. determinar la ocurrencia más común en una matriz
- 26. F #: ¿Cómo dividir una secuencia en una secuencia de secuencias
- 27. ¿Cómo abrir una nueva ventana secundaria desde otra ventana secundaria en vaadin?
- 28. expresión regular para obtener una cadena secundaria a través de php
- 29. MySQL: Seleccione filas con más de una ocurrencia
- 30. dividir una cadena en mayúsculas
¿Es esta tarea? – Blender
no es una tarea, lo primero que pensé fue en el sufijo trie, pero no estoy seguro de si es una buena opción, así que quería saber qué es lo primero que se le ocurre a otra persona. –