Leetcode, Valid Parentheses Problemi Çözümü (Kotlin)
Soruda verilen Stringde açık parantezler aynı tip parantez ile uygun şekilde kapatılmış ise true, değilse false döndürülmesi isteniyor. Örneğin "[()]{}", "[]()" Stringleri doğru iken "}[", "[(])" Stringleri yanlış.
Birkaç denemeden sonra şöyle bir çözüm yönteminde karar kıldım. Mantıken, bir for döngüsü ile karakterleri iterate ederken her kapalı parantez, ondan bir önceki son açık parantezin eşi olması gerekiyor.
Bu mantığı koda dökerken de açık parantezleri ekleyeceğim boş bir liste oluşturdum ve kapalı parantezlerin eşlerini içeren bir Map oluşturdum.
Önce, verilen Stringin uzunluğunun çift ve 2'den küçük olup olmadığını kontrol ediyorum. Zira parantezlerin hepsi kapalı olmak zorunda olduğundan Stringin karakter sayısı çift olmak zorunda ve en az 2 karakter olmak zorunda. Aksi halde direkt bu aşamada false döndürülüyor.
class Solution {
fun isValid(s: String): Boolean {
val parenthesesRev = mapOf(')' to '(', '}' to '{',']' to '[')
var willBeChecked: MutableList<Char> = mutableListOf()
if(s.length%2!=0 || s.length<2){return false}
For döngüsünde Stringdeki her açık parantez willBeChecked listesine ekleniyor. Böylece for döngüsünde her kapalı paranteze denk gelindiğinde willBeChecked listesindeki en sondaki açık parantezin eşi olup olmadığı kontrol edilecek ve eğer eşi ise bu eş parantez willBeChecked listesinden silinecek ve döngü devam edecek.
class Solution {
fun isValid(s: String): Boolean {
val parenthesesRev = mapOf(')' to '(', '}' to '{',']' to '[')
var willBeChecked: MutableList<Char> = mutableListOf()
if(s.length%2!=0 || s.length<2){return false}
for (i in 0..s.length-1){
when(s[i]){
'(', '{','[' -> willBeChecked.add(s[i])
else -> if(willBeChecked.size>0 && parenthesesRev[s[i]]==willBeChecked.last()){
willBeChecked.removeAt(willBeChecked.size-1)
}else{return false}
}
}
return willBeChecked.size==0
}
}
Eğer geçerli döngüde kapalı paranteze denk gelindiğinde willBeChecked listesindeki son eleman eşi değil ise false döndürülüyor. Orada koşul kısmında willBeChecked.last() fonksiyonunun liste boş iken çağrıldığında hata vermemesi için öncesinde willBeChecked.size>0 koşulu bulunuyor.
Tabi döngü bittiğinde willBeChecked.size==0 ifadesi eğer ki tüm kapalı parantezlerin eşleri listeden doğru sırada tamamen silinebildiyse true döndürüyor.
Yorumlar
Yorum Gönder