Не совсем, но я обнаружил, что эта модифицированная версия работает лучше в некоторых случаях
function findSubstring2(s, k)
local sub = string.sub
local gsub = string.gsub
local vowels = "[aeiou]"
local empty = ""
local _, numberOfVowels = gsub(s, vowels, empty)
if numberOfVowels == 0 then
return "Not found!"
end
local candidate = nil
local vowelnum = 0
local i=1
while i <= #s-k+1 do
local curr = sub(s, i, k + i - 1)
local _, nvow = gsub(curr, vowels, empty)
if nvow > vowelnum then
candidate = curr
vowelnum = nvow
end
i=i+(curr:find(vowels) or #curr)
end
return candidate
end
Как вы можете видеть, она всегда переходит к следующей гласной, что 1. делает ее быстрее для высоких k
в длинном s
с длинными цепочками согласных перед целевой строкой и 2. означает, что он может пропустить допустимую последовательность, имеет первую гласную после #s-k
(последняя позиция, с которой может начинаться подстрока), что у вас должно быть для смягчения некоторым особым случаем.
Стоит ли это ускорение, зависит от того, как выглядит ваша средняя строка ввода.