Java’da String Permütasyonlarını Bulma: Özyinelemeli (Recursive) Yöntem Rehberi 🔁
🚀 Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde, Java’da bir dizenin (String) tüm olası permütasyonlarını nasıl bulacağınızı adım adım öğreneceksiniz.
Özyinelemeli (recursive) yaklaşımı, Set yapısıyla tekrarları önlemeyi ve
performanslı sonuç üretmeyi uygulamalı olarak göreceksiniz.
🧠 Teknik Özet
Konu: Java’da String permütasyonları üretmek
Amaç: Bir dizenin karakterlerinden oluşturulabilecek tüm olası sıralamaları (permütasyonları) bulmak
Çözdüğü Problem: Kombinasyon, anagram veya sıralama algoritmalarında farklı dizilişlerin bulunması
Temel Adımlar:
- Dizenin ilk karakterini al.
- Geri kalan karakterlerin permütasyonlarını özyinelemeli olarak hesapla.
- İlk karakteri her alt permütasyonun tüm pozisyonlarına yerleştir.
- Tüm sonuçları
Setiçinde toplayarak tekrarı önle.
🧩 Java Permütasyon Algoritması Mantığı
Örnek: Dize = "ABC"
1️⃣ İlk karakteri ayır → "A"
2️⃣ Kalan "BC" için permütasyonları bul → "BC", "CB"
3️⃣ "A" karakterini bu sonuçların her konumuna yerleştir:
BC → ABC, BAC, BCA CB → ACB, CAB, CBA
pgsql
Sonuç: [ABC, ACB, BAC, BCA, CAB, CBA]
🧠 Bu yöntem, özyinelemeli (recursive) olarak tüm kombinasyonları üretir.
💻 Java ile String Permütasyonlarını Bulma
import java.util.HashSet;
import java.util.Set;
public class StringPermutasyon {
// Verilen dizenin tüm permütasyonlarını döndürür.
public static Set<String> permutationFinder(String str) {
Set<String> perm = new HashSet<>();
if (str == null) return null;
if (str.length() == 0) {
perm.add("");
return perm;
}
char ilkKarakter = str.charAt(0);
String kalan = str.substring(1);
Set<String> altPermutasyonlar = permutationFinder(kalan);
for (String kelime : altPermutasyonlar) {
for (int i = 0; i <= kelime.length(); i++) {
perm.add(charInsert(kelime, ilkKarakter, i));
}
}
return perm;
}
// Bir karakteri dizenin belirtilen pozisyonuna ekler.
public static String charInsert(String str, char c, int j) {
String bas = str.substring(0, j);
String son = str.substring(j);
return bas + c + son;
}
// Test için ana metot
public static void main(String[] args) {
String d1 = "AAB";
String d2 = "KLM";
System.out.println("\nPermütasyonlar " + d1 + " için: \n" + permutationFinder(d1));
System.out.println("\nPermütasyonlar " + d2 + " için: \n" + permutationFinder(d2));
}
}
🧠 Bu kod, tekrarlı harfleri Set yardımıyla filtreleyerek benzersiz permütasyonlar üretir.
📤 Örnek Çıktı
Permütasyonlar AAB için:
[AAB, ABA, BAA]
Permütasyonlar KLM için:
[KLM, KML, LKM, LMK, MKL, MLK]
💡 HashSet, aynı sonucu üreten permütasyonları (örneğin "AAB"’deki tekrarlar) otomatik olarak eler.
🔍 Algoritmanın Adımları (Özet Tablo)
| 🧩 Adım | ⚙️ İşlem | 💡 Açıklama |
|---|---|---|
| 1️⃣ | İlk karakter alınır | Örneğin "JAVA" → "J" + "AVA" |
| 2️⃣ | Kalan karakterler özyinelemeli işlenir | "AVA" → "AVA", "AAV", "VAA" |
| 3️⃣ | İlk karakter her pozisyona eklenir | "J" → "JAVA", "AJVA", "AVAJ" |
| 4️⃣ | Sonuçlar Set’te toplanır | Yinelenen sonuçlar otomatik olarak elenir. |
⏱️ Zaman Karmaşıklığı
Permütasyon sayısı n! (faktöriyel) kadar büyür. Yani karakter sayısı arttıkça işlem süresi dramatik şekilde artar.
| ⚙️ Girdi Uzunluğu | 🔢 Permütasyon Sayısı | ⏱️ Zaman Karmaşıklığı |
|---|---|---|
| 3 | 6 | O(n!) |
| 4 | 24 | O(n!) |
| 5 | 120 | O(n!) |
| 6 | 720 | O(n!) |
💬 Sıkça Sorulan Sorular (SSS)
- Neden HashSet kullanıyoruz?
Çünkü aynı karakterler varsa (AAB gibi), Set yapısı tekrarlayan sonuçları otomatik olarak eler.
- ArrayList yerine neden Set tercih edilir?
ArrayList tüm sonuçları saklarken, Set benzersiz değerleri filtreler. Bu, özellikle tekrarlı karakterlerde önemlidir.
- Zaman karmaşıklığı neden O(n!)?
Her karakter farklı pozisyonlara eklenir, bu da kombinasyon sayısını faktöriyel oranında artırır.
- Dize boş olduğunda ne olur?
Fonksiyon tek bir boş dize ([""]) döndürür, hata vermez.
- Daha hızlı yöntem var mı?
Java’da hazır bir permütasyon fonksiyonu yoktur. Ancak büyük verilerde iteratif algoritmalar veya paralel işlem (multithreading) kullanılabilir.
🏁 Sonuç
Bu rehberde, Java’da bir dizenin (String) tüm permütasyonlarını bulmayı adım adım öğrendiniz. Özyinelemeli yapı, hem mantığı anlamak hem de mülakatlarda öne çıkmak için mükemmel bir örnektir. Set kullanımıyla benzersiz sonuçlar üretmek ise profesyonel yaklaşım sağlar.
☁️ Kendi algoritmalarınızı Rabisu Bulut platformundaki Java çalışma ortamında test ederek performanslı şekilde deneyebilirsiniz!