Если str
очень длинный (или вы собираетесь проверять множество строк по одному и тому же набору плохих символов), вы можете получить некоторую производительность, создав таблицу соответствия размером 256, где элемент i равно 1, если символ с кодом ASCII i плохой, а ноль в противном случае:
int contains_bad(const char* str, const char* bad) {
unsigned short int table[256];
char* ch;
/* Prepare the lookup table */
memset(table, 0, 256);
for (ch = bad; *ch != 0; ch++)
table[*ch] = 1;
/* Test the string */
for (ch = str; *ch != 0; ch++)
if (table[*ch])
return -1;
return 1;
}
Приведенный выше код является наихудшим случаем O (m + n), где m длина плохая и n длина стр ;Ваше решение - O (mn) наихудший случай.
Обновление : вот альтернативная версия функции, которая сохраняет таблицу поиска в статическом хранилище и очищает ее только один раз в каждом255 вызовов.
int contains_bad(const char* str, const char* bad) {
static unsigned short int table[256];
static unsigned short int marker = 255;
char* ch;
/* Prepare the lookup table */
if (marker == 255) {
memset(table, 0, 256);
marker = 1;
} else {
marker++;
}
for (ch = bad; *ch != 0; ch++)
table[*ch] = marker;
/* Test the string */
for (ch = str; *ch != 0; ch++)
if (table[*ch] == marker)
return -1;
return 1;
}