2012-06-10 1 views
0

Учитывая две строки, подобные приведенным ниже, я хотел бы объединить их для генерации следующего. Результаты не имеет никакого смысла, однако, обе строки имеют «предложение» общее, что и считается соединителем между двумя строками:Функция Ruby для объединения двух строк в одну

"This is a sentence is a great thing" 

s1 = "This is a sentence" 

s2 = "a sentence is a great thing" 

Есть функция для этого в рубин?

+0

голец или слово- уровень? – tokland

ответ

1

Вот решение, которое работает.

def str_with_overlap(s1, s2) 
    result = nil 
    (0...(s2.length)).each do |idx| 
    break result = s1 + s2[(idx + 1)..-1] if s1.end_with?(s2[0..idx]) 
    end 
    result 
end 

str_with_overlap("This is a sentence", "a sentence is a great thing") 
# => This is a sentence is a great thing 
1

Насколько я знаю, в Ruby нет встроенной функции для этого.

Возможно, вам, вероятно, придется написать свою функцию. Прямая выполняется в квадратичном времени на входной длине. Тем не менее, это можно сделать в линейном времени в размере ввода, используя this algorithm.

1

нет встроенного метода в Ruby, но и может попробовать это один

class String 
    def merge str 
    result = self + str 
    for i in 1..[length,str.length].min 
     result = self[0,length-i] + str if self[-i,i] == str[0,i] 
    end 
    result 
    end 
end 

"This is a sentence".merge "a sentence is a great thing" 
+0

-1 для использования для цикла. Просто шучу. Смотри, хотя. – pguardiario

+0

для цикла является лучшим в этом случае)) ... я не знаю, почему у него это h8)) –

+0

Например, 1.upto лучше в этом случае, так как он не загрязняет основной объем. (1 .. [length, str.length] .min). Кажется, это лучше всего, потому что чаще всего это видно. – pguardiario

0

Функциональный подход (работает на уровне слова):

ws1, ws2 = [s1, s2].map(&:split) 
idx = 0.upto(ws1.size-1).detect { |i| ws1[i..-1] == ws2[0, ws1.size-i] } || 0 
(ws1[0, ws1.size-idx] + ws2).join(" ") 
=> "This is a sentence is a great thing" 
Смежные вопросы