Dizeleri bir dizi en uzun ortak başlangıç dize bul
Bu nispeten önemsiz bir sorun için en şık JavaScript, Ruby veya başka bir çözüm ile gelip bir meydan okuma.
Bu sorun Longest common substring problem daha özel bir durumdur. Sadece en uzun ortak bulmam lazımbaşlangıçbir dizi alt. Bu büyük ölçüde sorun kolaylaştırır.
Örneğin, [interspecies, interstelar, interstate]
en uzun dize"". inters Ancak, "" [specifics, terrific]
. ıfıc bulmaya ihtiyacım yok
Hızlı bir şekilde benim bir parçası olarak JavaScript ile bir çözüm kodlama ile sorunu çözdüm answer about shell-like tab-completion (test page here). İşte bu çözüm, biraz burkuldu:
function common_substring(data) {
var i, ch, memo, idx = 0
do {
memo = null
for (i=0; i < data.length; i ) {
ch = data[i].charAt(idx)
if (!ch) break
if (!memo) memo = ch
else if (ch != memo) break
}
} while (i == data.length && idx < data.length && idx)
return (data[0] || '').slice(0, idx)
}
Ruby benzer bir çözüm ile birlikte bu code is available in this Gist. Denemek için bir git repo gibi özü klon olabilir:
$ git clone git://gist.github.com/257891.git substring-challenge
Bu çözümlerin çok mutlu değilim. Karmaşıklık—bu challenge post ediyorum, bu yüzden daha zarif ve daha az yürütme ile çözülmüş olabilir gibi bir his var içimde.
Cevap olarak en şık ya da özlü buluyorum çözümü kabul edeceğim. Burada örneğin çılgın bir Ruby hack ile tanımlayan Dize: &
operatör çıkıyor
# works with Ruby 1.8.7 and above
class String
def &(other)
difference = other.to_str.each_char.with_index.find { |ch, idx|
self[idx].nil? or ch != self[idx].chr
}
difference ? self[0, difference.last] : self
end
end
class Array
def common_substring
self.inject(nil) { |memo, str| memo.nil? ? str : memo & str }.to_s
end
end
JavaScript veya Ruby çözümler tercih edilir, ama diğer dillerde akıllı çözüm neler olduğunu açıklamak sürece gösteriş olabilir. Standart kitaplığı lütfen kod sadece.
Güncelleme: benim en sevdiğim çözüm
"Bana öyle geldi ki," çünkü her ikisi de beklenmedik ve dahi olarak. cevap olarak kennebec JavaScript sorting solution seçtim Biz gerçek (hadi sonsuz dil uygulaması tarafından optimize hayal) sıralama karmaşıklığını göz ardı ederseniz, çözümü karmaşık sadece iki dizeleri karşılaştırmak.
Başka büyük çözümler:
- FM ile "regex greed" bir ya da iki dakika kavramak için alır, ama o zaman zerafet vurur. Yehuda Katz da a regex solution, ama daha karmaşık
commonprefix
in Python — Roberto Bonvallet bir özelliği dosya sistemi yolları bu sorunu çözmek için işlemek için kullanmışlardır- Haskell one-liner eğer sıkıştırılmış sanki kısa ve güzel
- the straightforward Ruby one-liner
Katıldığınız için teşekkürler! Yorum gördüğünüz gibi, bir sürü (hatta Ruby) öğrendim.
CEVAP
Python:
>>> from os.path import commonprefix
>>> commonprefix('interspecies interstelar interstate'.split())
'inters'
Neden uzun bir dize küçük dizeleri çok...
Listesi için dizeleri bir dizi Convert...
'dizi arasındaki fark ne ve dize?...
Java Dize dizisi için ArrayList içeren...
Dizi virgülle ayrılmış dize dönüştürme...