Pero dices que devuelves 1 si a es subcadena de b ?
// Es algo raro lo que voy a poner, ya aviso.
i=0;
j=0;
mirarhaciaatras=0;
atras_ok=1;
while ((cad1[i]!='\0')&&(cad2[i]!='\0')) { // Mq no llegues al final de alguna de las dos
if (cad1[i]==cad2[j])
{
//Mirar hacia atras la cadena Si no es igual seguir hacia delante de la segunda cadena.
if(mirarhaciaatras) {
mirarhaciaatras=0;
for(h=0;h<=i-1;h--)
{ atras_ok = (cad1[h]==cad2[j-h-1]) && atras_ok } // Mejor hacer bucle pero es =
}
if ( atras_ok) {
//Seguir hacia delante.
i++; j++; }
else { j++; miraratras=1;}
}
else { j++; mirarhaciaatras=1;}
}
if (( cad1[i]=='\0') && (cad2[i]=='\0') && i ==j )
// SON IGUALES
return ??;
if ( cad1[i]=='\0')
// cad1 es subcadena de cad2
return ??;
if (cad2[i] == '\0')
// cad1 no tiene nada que ver con cad2.
return ??;
Es un algoritmo raro pero eficiente, cuando encuentras una discrepancia en lugar de volver a atras sigues hacia delante. La idea la tome de un algoritmo que me explico un compañero en clase que utilizan para reconocimiento de patrones en el adn, creo, o eso me contaba el.
Explico la idea:
abc
lacabdabc
comparaciones:
a - l : NO j++
a -a : SI , atrasOK : i++ j++
b - c : NO , j++
b - b : SI, atras_ok: i++ j++
c - d : NO , j++
c - a: NO j++
c - b : NO j++
c - c : SI , atras_ok: SI , i++, j++
fin: cad1='\0' y cad2='\0' y i!=j