Önceki iki soruda sırasıyla önce bir yazıyı tersten yazdırdık, sonra da her bir harfin Java'da ascii kodunu bulma uygulaması yaptık. O zaman gecenin final sorusuna geçebiliriz. Bir kelimenin harflerinin değiştirilerek diğer kelimenin elde edilip edilemeyeceğini kontrol eden bir uygulama yapacağız (Bu işleme anagram adı veriliyor). Biz java'ya iki kelime (string) vereceğiz, java da bize verdiğimiz ilk kelimenin harflerinin değiştirilmesi ile (tüm permütasyonları kontrol ederek) diğer kelimeyi üretmenin mümkün olup olmadığını, bu kontrolü yapan bir metod kullanarak bulacak.
Örneğin:
- TAVA -> AVAT (Doğru)
- TAVA -> TAVV (Yanlış)
Çözüm:
public static void main(String[] args) {
String yazi1 = "patik";
String yazi2 = "kitop";
boolean kontrol=karakterPermutasyonu(yazi1, yazi2);
if (kontrol)
System.out.println(yazi1+" harflerinin yerlerini değiştirerek "+yazi2+" yazısı elde edilebilir");
else
System.out.println(yazi1+" harflerinin yerlerini değiştirerek "+yazi2+" yazısı elde edilemez");
}
public static boolean karakterPermutasyonu(String yazi1, String yazi2) {
int[] dizi = new int[300];
for (int i = 0; i < yazi1.length(); i++) {
dizi[(int) yazi1.charAt(i)] += 1;
}
for (int i = 0; i < yazi2.length(); i++) {
dizi[(int) yazi2.charAt(i)] -= 1;
}
for (int i = 0; i < dizi.length; i++) {
if (dizi[i] != 0)
return false;
}
return true;
}
Çıktı:
patik harflerinin yerlerini değiştirerek kitop yazısı elde edilemez
Çıktı 2: (yazi2="kitap" olarak değiştirildiğinde)
patik harflerinin yerlerini değiştirerek kitap yazısı elde edilebilir
Kodlara ilişkin algoritma açıklaması:
- karakterPermutasyonu metodu 2 adet String parametresi almaktadır: yazi1 ve yazi2
- Çözümü ascii kodları üzerinden sağlıyoruz, şöyle ki. 300 adet ascii kodunun yeterli olacağını düşünerek bir dizi tanımlıyoruz ve bu dizinin başlangıç elemanları Java tarafından 0 olarak atanmış oluyor.
- Önce yazi2 değişkeninin (yazi da olsa olurdu-sırası fark etmez) tüm harflerini ascii koduna dönüştürerek dizideki ilgili değeri 1 artıyoruz, bir nevi frekans vektörü olarak düşünebilirsiniz bunu. Bir benzerini zar örneğinde de yapmıştık.
- Sonra yazi değişkeninde de aynı işlemi yapıyoruz fakat bu sefer her bir dönüşüm sonrası dizideki ilgili elemandan 1 çıkartıyoruz.
- Sonuç olarak dizinin tüm elemanları eğer 0 ise artırıldığı kadar azaltılmıştır, dolayısıyla aynı harfler kullanılmıştır diyoruz ve metod true değer döndürüyor.