Leetcode, Longest Common Prefix Problemi Çözümü (Kotlin)
Soruda, Stringlerden oluşan Array'de tüm Stringlerdeki en uzun aynı ön ek isteniyor. Örneğin ["flow","flower","fly"] dizisi için cevap "fl".
Öncelikle cevap olarak döndürülen Stringin karakter sayısı mantıken en fazla, dizideki en az karakterli Stringinki kadar olabilir. Bu yüzden benim çözümümde önce dizideki en kısa Stringi bulmak gerekiyor.
Aşağıdaki yöntemle en kısa Stringi Arraydeki ilk eleman varsayıyoruz ve for döngüsünde daha kısasını buldukça onu shortest (en kısa) değişkenine atıyoruz.
var shortest: String = strs[0] //strs soruda verilen String dizisi.
for(s in 0..strs.size-1){
if(strs[s].length<shortest.length){
shortest = strs[s]
}
}
Verilen dizide boş String de bulunabilir. Böyle bir durum olduğunda dizide ortak ön ek (common prefix) bulunmuyor demektir. Bu yüzden kodun devamında önce bunu kontrol ediyorum. Ardından iç içe for döngüsü kullanıyorum.
class Solution {
fun longestCommonPrefix(strs: Array<String>): String {
var commonPrefix: String = ""
var shortest: String = strs[0]
for(s in 0..strs.size-1){
if(strs[s].length<shortest.length){
shortest = strs[s]
}
}
if(shortest.length>0){
for(x in 0..shortest.length-1){ // En kısa elemanın indekslerinde for döngüsü başlıyor.
val temp = strs[0][x] // X: Dizideki ilk Stringin harflerinin indeksi
for(i in 0..strs.size-1){ // Dizideki Stringler iterate ediliyor
if(strs[i][x]!=temp){
return commonPrefix
}
}
commonPrefix+=temp
}
}
return commonPrefix
}
}
İlk for döngüsünden anlatmaya başlayayım. Burada ilk for döngüsünün aralığı için en kısa elemanın karakter indeksleri kullanılırken alttaki/içteki for döngüsünde dizinin indeksleri kullanılıyor. Bunun bu şekilde bir nevi ters olmasının sebebi dizideki Stringlerin indekslerindeki karakterlerin diğer Stringlerin aynı indeksteki karakterleri ile aynı olup olmadığının kontrolünün yapılacak olması.
Örneğin (temp, strs[0][0]) = 's' olsun. Alttaki for başladığında dizideki her Stringin 0. elemanı 's' mi şeklinde kontrol ediliyor. Bu döngü bir eşitsizlik durumu olmazsa dizinin son elemanına kadar devam ediyor. Eğer sona gelinirse bu sefer kontroller aynı şekilde bu dizideki Stringlerin ikinci karakterleri (yani 1. indeksleri) için başlıyor. Alttaki for döngüsü her diziyi bitirişinde temp değişkenini commonPrefix değişkenine ekliyor ta ki bir eşitsizlik durumu oluşana veya iki for döngüsünün de işi bitene kadar.
Yorumlar
Yorum Gönder