Я думаю, что вы можете решить проблему, как указано, для произвольных размеров алфавита, с учетом точности с плавающей запятой. Для алфавита из n символов сопоставьте текстовые символы с (сложными) n-ю корнями единицы. Для символов шаблона сопоставьте # с 0 и сопоставьте обычные символы с мультипликативной инверсией соответствующего символа текста, а также n-ными корнями единицы.
Затем вы используете теорему свертки для определения в каждой точке точечного произведения текста с этой точки с шаблоном. Если текст и шаблон совпадают, каждый компонент продукта равен либо 0 (подстановочный знак), либо 1 из r * r ^ -1, поэтому, если у вас есть совпадение, результатом будет m, где m - число не подстановочных знаков в шаблоне. Если нет совпадения, то не все компоненты скалярного произведения будут равны 1. Думая об этих комплексных числах как двухмерных векторах, скалярное произведение этих векторов с вектором, представляющим 1, будет меньше m, поэтому несоответствие не может привести к результату m и выглядеть как совпадение.
Замечу, что если вы разделите текст на буферы, длина которых в несколько раз превышает длину шаблона, вы можете использовать БПФ такой длины достаточно эффективно, поэтому сложность не равна n log n, где n - длина текст для поиска, но n log m, где m - длина шаблона. Несмотря на это, мне нужно будет увидеть время тестирования, прежде чем я пойму, что это конкурентный метод по сравнению даже с наивным поиском.