Bir dize göz önüne alındığında , en uzun yinelenen (en az iki kez) sonraki bulmak istiyorum. Kendisine, bir dizi bulmak istiyoruz bir sekans olan (a bitişik olmak zorunda değildir) bu şekilde . Yani , yarıları üst üste iki kez görünen bir dizedir. Not bu bir sekans olan zorunlu bir alt, ama.
Örnekler:
'Ababccabdc' için 'abcabc' olacaktır, çünkü 'abc' = 'abc' ve 'abc' (ababccabdc) 'de en az iki kez görünür.
'Addbacddabcd' için bir seçenek 'dddd' çünkü 'dd' iki kez görünüyor (aynı mektubu birkaç kez kullanamıyorum, ama burada 4 'd's var tamam), ama lebngth 4. Daha iyi bir tane bulabilirim 'abcd', çünkü 'abcd' iki kez görünen 'addbacddabcd' nin bir alt dizesidir.
En uzun yinelenen alt diziyi bulmak istiyorum. Buna "en uzun / en büyük kareyi bulma" da denir, ancak alt dizge için bir karenin bir alt dizge için tanımlandığı birçok makaleyi okudum.
Dizede bir kesme noktası için tüm seçenekleri yineleyerek alacak bir kaba kuvvet algoritması kolayca kullanabilirim ve sonra en büyük / en uzun ortak alt diziyi arayacağım iki dizeye sahip olacağım, ancak her kontrol dinamik bir programlama tekniği kullanarak alacaktır , bu nedenle tüm zaman . En uzun ortak takip için alan daha verimli bir algoritma buldum , böylece çalışma süresi .
En uzun yinelenen sonraki problem için daha verimli bir algoritma arıyorum. Belki de tüm kesme noktalarında yineleme fikrim çok fazla zaman harcıyor ve daha az yinelemeye indirgenebiliyor. Ya da belki de farklı bir tutuma sahip bir algoritma bu sorunu çözebilir.
Birçok dergi ve önceki soruları araştırdım ve bulduğum sonuçların çoğu bir alt diziyle ilgili ve bir alt diziyle ilgili değildi.
Ben de bu sonek ağaçları kullanılarak yapılabilir, ama bu da alt dizeleri ile ilgili ve ben böyle bir fikir sonraki için genişletilebilir olup olmadığını emin değilim.
Zaman içinde çalışan bir çözüm arıyorum . Zaman içinde bir tane varsa daha iyi olacaktır (böyle olup olmadığından emin değilim).
$
, LCS problemini çözer.