2011-12-22 18 views
6

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

+0

¿Es esta tarea? – Blender

+0

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. –

Respuesta

17

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; 
} 
+0

Supongo que no es posible en mejor que O (n)? –

+0

@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

+0

logN para la búsqueda binaria de la cadena? –

-1

encontrar la longitud de la longest common subsequence. Si es igual a la longitud de pequeña cadena, solución verdadera

+14

¡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

+0

Sí, tienes razón. – MBo

1
// 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; 
} 
0

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; 
} 
Cuestiones relacionadas