Escriba una función strcmp modificada que ignore los casos y devuelva -1 si s1 < s2, 0 si s1 = s2, de lo contrario devuelve 1. Por ejemplo, su strcmp debería considerar «GeeksforGeeks» y «geeksforgeeks» como la misma string.
Fuente: Conjunto de entrevistas de Microsoft 5 La
siguiente solución supone que los caracteres se representan mediante representación ASCII, es decir, los códigos para ‘a’, ‘b’, ‘c’,… ‘z’ son 97, 98, 99,… 122 respectivamente. Y los códigos para ‘A’, “B”, ‘C’,… ‘Z’ son 65, 66,… 90 respectivamente.
Los siguientes son los pasos detallados.
1) Iterar a través de cada carácter de ambas strings y hacer lo siguiente para cada carácter.
… a) Si str1[i] es lo mismo que str2[i], entonces continúe.
… b)Si invertir el sexto bit menos significativo de str1[i] lo hace igual que str2[i], entonces continúe. Por ejemplo, si str1[i] es 65, entonces invertir el sexto bit lo convertirá en 97. Y si str1[i] es 97, entonces invertir el sexto bit lo convertirá en 65.
… c) Si alguna de las dos condiciones anteriores no es cierto, entonces romper.
2) Compare los últimos (o la primera falta de coincidencia en caso de que no sean iguales) caracteres.
C++
#include <bits/stdc++.h> using namespace std; /* implementation of strcmp that ignores cases */ int ic_strcmp(string s1, string s2) { int i; for (i = 0; s1[i] && s2[i]; ++i) { /* If characters are same or inverting the 6th bit makes them same */ if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i]) continue; else break; } /* Compare the last (or first mismatching in case of not same) characters */ if (s1[i] == s2[i]) return 0; // Set the 6th bit in both, then compare if ((s1[i] | 32) < (s2[i] | 32)) return -1; return 1; } // Driver program to test above function int main() { cout<<"ret: "<<ic_strcmp("Geeks", "apple") <<endl; cout<<"ret: "<<ic_strcmp("", "ABCD")<<endl; cout<<"ret: "<<ic_strcmp("ABCD", "z")<<endl; cout<<"ret: "<<ic_strcmp("ABCD", "abcdEghe")<<endl; cout<<"ret: "<<ic_strcmp("GeeksForGeeks", "gEEksFORGeEKs")<<endl; cout<<"ret: "<<ic_strcmp("GeeksForGeeks", "geeksForGeeks")<<endl; return 0; } //This code is contributed by rathbhupendra
C
#include <stdio.h> /* implementation of strcmp that ignores cases */ int ic_strcmp(char *s1, char *s2) { int i; for (i = 0; s1[i] && s2[i]; ++i) { /* If characters are same or inverting the 6th bit makes them same */ if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i]) continue; else break; } /* Compare the last (or first mismatching in case of not same) characters */ if (s1[i] == s2[i]) return 0; // Set the 6th bit in both, then compare if ((s1[i] | 32) < (s2[i] | 32)) return -1; return 1; } // Driver program to test above function int main(void) { printf("ret: %d\n", ic_strcmp("Geeks", "apple")); printf("ret: %d\n", ic_strcmp("", "ABCD")); printf("ret: %d\n", ic_strcmp("ABCD", "z")); printf("ret: %d\n", ic_strcmp("ABCD", "abcdEghe")); printf("ret: %d\n", ic_strcmp("GeeksForGeeks", "gEEksFORGeEKs")); printf("ret: %d\n", ic_strcmp("GeeksForGeeks", "geeksForGeeks")); return 0; }
Producción:
ret: 1 ret: -1 ret: -1 ret: -1 ret: 0 ret: 0
Complejidad de tiempo: O(min(|s1|, |s2|))
Espacio Auxiliar: O(1)
Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA