Это работает, но работает медленнее, я не думаю, что решение на основе регулярных выражений будет быстрее.
string.scan(/\S{2,}/).map { |word| "%#{word}%" }
Избегание дублирования массивов кажется самым быстрым:
words = string.split
words.reject! { |s| s.length == 1 }
words.map! { |s| "%#{s}%" }
words