Metin işleme (String Manipulation), modern yazılım sistemlerinin ve doğal dil işleme (NLP) algoritmalarının en temel disiplinlerinden biridir. Bir arama motoruna yazdığınız sorgunun analiz edilmesinden biyoinformatikteki DNA dizilimlerinin taranmasına kadar her yerde karakter dizileri işlenir. Bu alandaki en popüler ve öğretici algoritmik problemlerden biri ise **Palindrom Kontrolü (Palindrome Verification)** ve **Metin Ters Çevirme (String Reversal)** algoritmalarıdır. Hem mülakatlarda hem de algoritma olimpiyatlarında sıkça karşımıza çıkan bu kavramları, en verimli iki gösterici (Two-Pointer) tekniği ve yığın (Stack) veri yapılarıyla ele alıyoruz.
---
1. Palindrom Nedir?
Düzden ve tersten okunuşları tamamen aynı olan kelimelere, cümlelere veya sayılara **Palindrom** adı verilir.
---
2. Çözüm Yaklaşımı 1: İlkel Yöntem (Metni Ters Çevirip Karşılaştırma)
Pek çok yeni başlayan öğrencinin aklına gelen ilk yöntem şudur:
`Metni al -> Ters çevir -> Orijinal metinle eşit mi diye kontrol et.`
Python'da tek satırda yazılabilir:
def is_palindrome_naive(s):
return s == s[::-1]
Bu Yöntemin Akademik Eksisi Nedir?
---
3. Çözüm Yaklaşımı 2: İki Gösterici (Two-Pointer) Tekniği ile $O(1)$ Bellek
En profesyonel ve bellek tasarruflu yöntem, metni hiç kopyalamadan iki gösterici (pointer) ile uçlardan merkeze doğru incelemektir:
1. `Sol Gösterici (Left):` Metnin 0. indeksine (ilk karakterine) yerleştirilir.
2. `Sağ Gösterici (Right):` Metnin sonuncu indeksine ($n-1$) yerleştirilir.
3. Her adımda:
4. Göstericiler ortada karşılaştığında (`Sol >= Sağ`), metnin kesinlikle palindrom olduğu kanıtlanmış olur!
Zaman Karmaşıklığı: **$O(n/2) pprox O(n)$**
Alan Karmaşıklığı: **$O(1)$** (Sıfır ekstra bellek!).
---
4. Gerçek Dünya Problemi: Cümle Düzeyinde Palindrom Filtreleme
Gerçek hayattaki cümlelerde boşluklar, virgüller, kesme işaretleri ve büyük/küçük harf farklılıkları vardır:
Örneğin `"Ey Edip Adana'da pide ye!"` cümlesi ilk bakışta harf harf eşit değildir.
Algoritmamızın iki göstericiyi hareket ettirirken:
---
5. Tam ve Çalışan Kodlar
Python ile Cümle Düzeyinde İki Göstericili Palindrom Kontrolü:
def is_palindrome_advanced(s: str) -> bool:
left = 0
right = len(s) - 1
while left < right:
# Soldaki karakter harf veya rakam değilse geç
while left < right and not s[left].isalnum():
left += 1
# Sağdaki karakter harf veya rakam değilse geç
while left < right and not s[right].isalnum():
right -= 1
# Karşılaştırma yap
if s[left].lower() != s[right].lower():
return False
left += 1
right -= 1
return True
# Test Cümleleri
test1 = "Ey Edip Adana'da pide ye!"
test2 = "Robotik Kodlama Dünyası"
print(f"'{test1}' -> Palindrom mu? :", is_palindrome_advanced(test1))
print(f"'{test2}' -> Palindrom mu? :", is_palindrome_advanced(test2))
C++ ile Sayısal Palindrom Kontrolü (String'e Çevirmeden Matematiksel Çözüm):
#include <iostream>
bool isNumberPalindrome(int x) {
// Negatif sayılar veya sonu 0 ile biten sayılar (0 hariç) palindrom olamaz
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int reversedHalf = 0;
while (x > reversedHalf) {
reversedHalf = (reversedHalf * 10) + (x % 10);
x /= 10;
}
// Sayı çift basamaklıysa x == reversedHalf, tek basamaklıysa x == reversedHalf / 10
return (x == reversedHalf) || (x == reversedHalf / 10);
}
int main() {
int sayi = 12321;
std::cout << sayi << " Palindrom mu? " << (isNumberPalindrome(sayi) ? "EVET" : "HAYIR") << std::endl;
return 0;
}
---
6. Biyoinformatik ve DNA Kriptografisinde Palindromik Diziler
İnsan genetiğinde DNA sarmalları üzerinde yer alan bazı baz dizilimleri (örneğin `5'-GAATTC-3'` ile karşıtı `3'-CTTAAG-5'`) palindromik yapıdadır. Bakteriler ve bağışıklık sistemimizdeki enzimler (Restriksiyon Enzimleri), virüslerin DNA'larını tam bu palindromik noktalardan tanıyıp keserek etkisiz hale getirir. Günümüzde gen düzenleme teknolojisi olan **CRISPR-Cas9**, adını tam olarak bu mekanizmadan (Kümelenmiş Düzenli Arayalı Kısa Palindromik Tekrarlar) almaktadır!
---
7. Kendini Geliştirme Görevi (Challenge)
**En Uzun Palindromik Alt Dizi (Longest Palindromic Substring):** Verilen bir metin içerisindeki (örneğin `"babad"`) en uzun palindromik parçayı (`"bab"` veya `"aba"`) bulan bir algoritma tasarlayın. Merkezden dışarıya doğru genişleme (Expand Around Center) tekniğini kullanmayı deneyin!
---
---
8. Yığın (Stack - LIFO) Veri Yapısı ile Palindrom Doğrulama
İki gösterici tekniğine alternatif olarak veri yapıları derslerinde en çok öğretilen yöntem **Yığın (Stack)** kullanımıdır:
1. Metnin ilk yarısındaki karakterler sırayla yığına atılır (`push`).
2. Yığın **Son Giren İlk Çıkar (LIFO - Last In First Out)** mantığıyla çalıştığı için karakterler doğal olarak ters sıralanır.
3. Metnin ikinci yarısı okunurken yığından sırayla eleman çekilir (`pop`).
4. Eğer her adımda yığından çıkan karakter metindeki karakterle eşleşiyorsa, kelime kesinlikle bir palindromdur.
Bu yaklaşım, tek yönlü bağlı listelerde (Singly Linked List) geriye doğru indeksleme yapılamadığında palindrom kontrolü yapmanın en pratik yoludur.
---
Sonuç
Palindrom kontrolü, string işleme mantığının ve gösterici algoritmalarının temel yapı taşıdır. İki gösterici (Two-Pointer) tekniği, leetcode mülakatlarından veri optimizasyonuna kadar yazılım kariyerinizde her zaman başvuracağınız en değerli silahlardan biridir. Sitemizdeki diğer [Kodlama Derslerine](/dersler) göz atarak bilginizi derinleştirebilirsiniz!