SORU
16 Aralık 2009, ÇARŞAMBA


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:

Katıldığınız için teşekkürler! Yorum gördüğünüz gibi, bir sürü (hatta Ruby) öğrendim.

CEVAP
16 Aralık 2009, ÇARŞAMBA


Python:

>>> from os.path import commonprefix
>>> commonprefix('interspecies interstelar interstate'.split())
'inters'

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Washington

    Adam Washing

    12 Mayıs 2006
  • colacas

    colacas

    29 EKİM 2006
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013