РЕДАКТИРОВАТЬ: Спасибо Люку Турэю за огромное улучшение оригинального алгоритма.
Создать массив a[10]
логических значений. Для каждой ожидаемой цифры e
установите a[e] = true
.
Теперь для каждой цифры d
в вашем входе, проверьте, является ли a[d]
истиной. Если это не так, верните false. Если все они успешны, верните true.
Вы можете обобщить это для всех символов ASCII с массивом из 256 элементов.
Если ваша входная строка имеет длину N, ваша строка сравнения имеет длину M, а количество букв в вашем алфавите равно A, то сложность составляет O (N + M) (для сканирования двух строк) плюс O (A ) (для инициализации логического массива). Поэтому, если длина вашей строки не превышает размер алфавита или превышает его, это может быть неоптимальным.
Стоит отметить, что в отношении превосходного сравнения производительности Никласа Баумстарка, наши два решения фактически одинаковы. Построенный здесь логический массив идентичен таблице переходов, которую вы строите в двух состояниях DFA , принимающей [c 1 c 2 ...] *. Думаю, единственное отличие состоит в том, что реализация Java, будучи гораздо более общей, несет в себе гораздо больше накладных расходов.