以下のような2つの文字列がある場合、それらをマージして次の文字列を生成します。結果はほとんど意味がありませんが、両方の文字列に共通の「文」があります。これは、2つの文字列間のコネクタとしてカウントされます。
"This is a sentence is a great thing"
s1 = "This is a sentence"
s2 = "a sentence is a great thing"
ルビーにこれのための機能はありますか?
以下のような2つの文字列がある場合、それらをマージして次の文字列を生成します。結果はほとんど意味がありませんが、両方の文字列に共通の「文」があります。これは、2つの文字列間のコネクタとしてカウントされます。
"This is a sentence is a great thing"
s1 = "This is a sentence"
s2 = "a sentence is a great thing"
ルビーにこれのための機能はありますか?
これが機能するソリューションです。
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
私の知る限り、Rubyにはこのための組み込み関数はありません。
おそらく、このために独自の関数を作成する必要があります。単純なものは、入力長で2次時間で実行されます。ただし、このアルゴリズムを使用することにより、入力サイズで線形時間でそれを行うことができます。
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"
機能的アプローチ(単語レベルで機能):
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"