{"id":34621,"date":"2025-11-19T22:40:56","date_gmt":"2025-11-19T19:40:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=34621"},"modified":"2025-11-19T22:40:56","modified_gmt":"2025-11-19T19:40:56","slug":"dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/","title":{"rendered":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)"},"content":{"rendered":"<p><body><\/p>\n<h2>Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)<\/h2>\n<p>### Giri\u015f<\/p>\n<p>Bilgisayar bilimlerinde ve yaz\u0131l\u0131m geli\u015ftirmede dize (string) manip\u00fclasyonu, bir\u00e7ok problemin temelini olu\u015fturur. Bu problemlerden biri, verilen bir dize i\u00e7indeki en uzun palindromik alt dizeyi (Longest Palindromic Substring &#8211; LPS) bulmakt\u0131r. Bu makalede, bu klasik problemi ele alacak, farkl\u0131 algoritmik yakla\u015f\u0131mlar\u0131 Java dilinde kod \u00f6rnekleriyle birlikte detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<p>Peki, &#8220;palindrom&#8221; nedir? Bir palindrom, tersten okundu\u011funda da ayn\u0131 olan bir kelime, say\u0131, c\u00fcmle veya dizedir. \u00d6rne\u011fin, &#8220;madam&#8221;, &#8220;kayak&#8221;, &#8220;ana&#8221; veya &#8220;level&#8221; kelimeleri birer palindromdur. &#8220;Alt dize&#8221; ise, bir dizenin ard\u0131\u015f\u0131k karakterlerinden olu\u015fan bir b\u00f6l\u00fcm\u00fcd\u00fcr. \u00d6rne\u011fin, &#8220;banana&#8221; dizisinin alt dizeleri &#8220;ban&#8221;, &#8220;ana&#8221;, &#8220;nan&#8221; gibi bir\u00e7ok farkl\u0131 kombinasyonu i\u00e7erebilir. &#8220;Longest Palindromic Substring&#8221; problemi ise, verilen bir dizenin t\u00fcm alt dizeleri aras\u0131nda palindrom olanlar\u0131n en uzununu bulmay\u0131 hedefler.<\/p>\n<p>Bu problem, sadece akademik bir egzersiz olman\u0131n \u00f6tesinde, biyoinformatik (DNA ve RNA dizisi analizi), metin i\u015fleme, veri s\u0131k\u0131\u015ft\u0131rma ve \u00f6r\u00fcnt\u00fc tan\u0131ma gibi \u00e7e\u015fitli alanlarda pratik uygulamalara sahiptir. Farkl\u0131 algoritmik yakla\u015f\u0131mlar, problemin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 anlamak ve verimli \u00e7\u00f6z\u00fcmler tasarlamak i\u00e7in \u00f6nemli bir zemin sunar. Bu makalede, kaba kuvvet (brute-force) y\u00f6nteminden ba\u015flayarak, merkezden geni\u015fletme (expand around center), dinamik programlama ve son olarak en verimli olan Manacher algoritmas\u0131na kadar \u00e7e\u015fitli \u00e7\u00f6z\u00fcm yollar\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>### Problemin Tan\u0131m\u0131 ve \u00d6rnekler<\/p>\n<p>Longest Palindromic Substring (LPS) problemi, matematiksel olarak \u015fu \u015fekilde tan\u0131mlanabilir: Verilen bir $S$ dizisi i\u00e7in, $S$&#8217;nin t\u00fcm alt dizeleri $S[i \\dots j]$ aras\u0131ndan, tersten okundu\u011funda kendisine e\u015fit olan (yani palindrom olan) ve $j-i+1$ uzunlu\u011fu maksimum olan alt dizeyi bulun. E\u011fer birden fazla en uzun palindromik alt dize varsa, herhangi birini d\u00f6nd\u00fcrmek yeterlidir.<\/p>\n<p>\u00d6rneklerle problemi daha iyi anlayal\u0131m:<\/p>\n<p>1.  <strong>Giri\u015f:<\/strong> &#8220;babad&#8221;<br \/>\n    *   <strong>\u00c7\u0131k\u0131\u015f:<\/strong> &#8220;bab&#8221; veya &#8220;aba&#8221;. Her ikisi de 3 karakter uzunlu\u011fundad\u0131r ve en uzun palindromdur.<\/p>\n<p>2.  <strong>Giri\u015f:<\/strong> &#8220;cbbd&#8221;<br \/>\n    *   <strong>\u00c7\u0131k\u0131\u015f:<\/strong> &#8220;bb&#8221;. 2 karakter uzunlu\u011fundad\u0131r.<\/p>\n<p>3.  <strong>Giri\u015f:<\/strong> &#8220;a&#8221;<br \/>\n    *   <strong>\u00c7\u0131k\u0131\u015f:<\/strong> &#8220;a&#8221;. 1 karakter uzunlu\u011fundad\u0131r.<\/p>\n<p>4.  <strong>Giri\u015f:<\/strong> &#8220;ac&#8221;<br \/>\n    *   <strong>\u00c7\u0131k\u0131\u015f:<\/strong> &#8220;a&#8221; veya &#8220;c&#8221;. Her ikisi de 1 karakter uzunlu\u011fundad\u0131r.<\/p>\n<p>5.  <strong>Giri\u015f:<\/strong> &#8220;forgeeksskeegfor&#8221;<br \/>\n    *   <strong>\u00c7\u0131k\u0131\u015f:<\/strong> &#8220;geeksskeeg&#8221;. 10 karakter uzunlu\u011fundad\u0131r.<\/p>\n<p>Bu \u00f6rnekler, farkl\u0131 dize tipleri i\u00e7in problemin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. \u015eimdi bu problemi \u00e7\u00f6zmek i\u00e7in kullanabilece\u011fimiz farkl\u0131 algoritmik yakla\u015f\u0131mlara ge\u00e7elim.<\/p>\n<p>### Temel Yakla\u015f\u0131mlar<\/p>\n<p>#### Brute-Force (Kaba Kuvvet) Yakla\u015f\u0131m\u0131<\/p>\n<p>Kaba kuvvet yakla\u015f\u0131m\u0131, bir problemi \u00e7\u00f6zmek i\u00e7in en basit ve en do\u011frudan y\u00f6ntemdir. LPS probleminde, bu yakla\u015f\u0131m, verilen dizenin t\u00fcm olas\u0131 alt dizelerini olu\u015fturmay\u0131, her bir alt dizenin palindrom olup olmad\u0131\u011f\u0131n\u0131 kontrol etmeyi ve bu s\u00fcre\u00e7te bulunan en uzun palindromu takip etmeyi i\u00e7erir.<\/p>\n<p><strong>Algoritma Ad\u0131mlar\u0131:<\/strong><\/p>\n<p>1.  <code>longestPalindrome<\/code> ad\u0131nda bo\u015f bir dize tan\u0131mlay\u0131n.<br \/>\n2.  Dizinin ba\u015flang\u0131c\u0131ndan sonuna kadar <code>i<\/code> indeksini kullanarak t\u00fcm olas\u0131 ba\u015flang\u0131\u00e7 noktalar\u0131n\u0131 yineleyin.<br \/>\n3.  Her <code>i<\/code> i\u00e7in, <code>i<\/code>&#8216;den dizinin sonuna kadar <code>j<\/code> indeksini kullanarak t\u00fcm olas\u0131 biti\u015f noktalar\u0131n\u0131 yineleyin.<br \/>\n4.  <code>s[i...j]<\/code> alt dizesini \u00e7\u0131kar\u0131n.<br \/>\n5.  Bu alt dizenin bir palindrom olup olmad\u0131\u011f\u0131n\u0131 kontrol edin. Bunu yapmak i\u00e7in, alt dizeyi tersten okuyup orijinaliyle kar\u015f\u0131la\u015ft\u0131rabilir veya iki i\u015faret\u00e7i (sol ve sa\u011f) kullanarak merkeze do\u011fru ilerleyebilirsiniz.<br \/>\n6.  E\u011fer alt dize bir palindromsa ve <code>longestPalindrome<\/code>&#8216;dan daha uzunsa, <code>longestPalindrome<\/code>&#8216;\u0131 bu yeni alt dize ile g\u00fcncelleyin.<br \/>\n7.  T\u00fcm alt dizeler kontrol edildikten sonra, <code>longestPalindrome<\/code> sonucunu d\u00f6nd\u00fcr\u00fcn.<\/p>\n<p><strong>Uygulama Detaylar\u0131 ve Karma\u015f\u0131kl\u0131k Analizi:<\/strong><\/p>\n<p>Bu yakla\u015f\u0131m \u00fc\u00e7 i\u00e7 i\u00e7e d\u00f6ng\u00fc gerektirir:<br \/>\n*   D\u0131\u015f d\u00f6ng\u00fc <code>i<\/code> i\u00e7in $N$ iterasyon.<br \/>\n*   \u0130\u00e7 d\u00f6ng\u00fc <code>j<\/code> i\u00e7in $N$ iterasyon.<br \/>\n*   Palindrom kontrol\u00fc i\u00e7in (en k\u00f6t\u00fc durumda) $N$ iterasyon.<\/p>\n<p>Dolay\u0131s\u0131yla, zaman karma\u015f\u0131kl\u0131\u011f\u0131 $O(N^3)$&#8217;t\u00fcr. $N$, giri\u015f dizisinin uzunlu\u011fudur. Bu, b\u00fcy\u00fck giri\u015f dizileri i\u00e7in olduk\u00e7a verimsizdir. \u00d6rne\u011fin, 1000 karakterlik bir dize i\u00e7in $1000^3 = 1$ milyar i\u015flem anlam\u0131na gelir ki bu kabul edilemez derecede yava\u015ft\u0131r.<\/p>\n<p>Alan karma\u015f\u0131kl\u0131\u011f\u0131 ise, her seferinde bir alt dize olu\u015fturmak i\u00e7in $O(N)$ ve <code>longestPalindrome<\/code>&#8216;\u0131 saklamak i\u00e7in $O(N)$ oldu\u011fundan, genel olarak $O(N)$&#8217;dir.<\/p>\n<p><strong>Java Kod \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-java\">public class LongestPalindromicSubstring {\n\n    \/\/ Yard\u0131mc\u0131 metot: Bir dizenin palindrom olup olmad\u0131\u011f\u0131n\u0131 kontrol eder\n    private boolean isPalindrome(String s) {\n        int left = 0;\n        int right = s.length() - 1;\n        while (left < right) {\n            if (s.charAt(left) != s.charAt(right)) {\n                return false;\n            }\n            left++;\n            right--;\n        }\n        return true;\n    }\n\n    \/\/ Kaba Kuvvet Yakla\u015f\u0131m\u0131\n    public String longestPalindromeBruteForce(String s) {\n        if (s == null || s.length() < 1) {\n            return \"\";\n        }\n\n        String longestPalindrome = \"\";\n        for (int i = 0; i < s.length(); i++) {\n            for (int j = i; j < s.length(); j++) {\n                String sub = s.substring(i, j + 1);\n                if (isPalindrome(sub)) {\n                    if (sub.length() > longestPalindrome.length()) {\n                        longestPalindrome = sub;\n                    }\n                }\n            }\n        }\n        return longestPalindrome;\n    }\n\n    \/\/ main metodu \u00f6rnek kullan\u0131m i\u00e7in\n    public static void main(String[] args) {\n        LongestPalindromicSubstring solver = new LongestPalindromicSubstring();\n\n        System.out.println(\"Brute-Force:\");\n        System.out.println(\"babad -> \" + solver.longestPalindromeBruteForce(\"babad\")); \/\/ bab veya aba\n        System.out.println(\"cbbd -> \" + solver.longestPalindromeBruteForce(\"cbbd\"));   \/\/ bb\n        System.out.println(\"a -> \" + solver.longestPalindromeBruteForce(\"a\"));       \/\/ a\n        System.out.println(\"ac -> \" + solver.longestPalindromeBruteForce(\"ac\"));      \/\/ a\n        System.out.println(\"forgeeksskeegfor -> \" + solver.longestPalindromeBruteForce(\"forgeeksskeegfor\")); \/\/ geeksskeeg\n    }\n}<\/code><\/pre>\n<p>#### Merkezden Geni\u015fletme (Expand Around Center) Yakla\u015f\u0131m\u0131<\/p>\n<p>Kaba kuvvet yakla\u015f\u0131m\u0131n\u0131n verimsizli\u011fini gidermek i\u00e7in daha ak\u0131ll\u0131 bir yakla\u015f\u0131m geli\u015ftirebiliriz. Bir palindromun merkezine g\u00f6re simetrik oldu\u011fu g\u00f6zleminden yola \u00e7\u0131karak, her olas\u0131 merkezi ele al\u0131p bu merkezden d\u0131\u015far\u0131 do\u011fru geni\u015fleyebiliriz.<\/p>\n<p>Palindromlar\u0131n iki t\u00fcr merkezi olabilir:<br \/>\n1.  <strong>Tek uzunluklu palindromlar:<\/strong> Tek bir karakter merkezlidir (\u00f6rne\u011fin, &#8220;racecar&#8221; i\u00e7in &#8216;e&#8217;).<br \/>\n2.  <strong>\u00c7ift uzunluklu palindromlar:<\/strong> \u0130ki karakterin aras\u0131 merkezlidir (\u00f6rne\u011fin, &#8220;abba&#8221; i\u00e7in &#8216;bb&#8217; aras\u0131ndaki bo\u015fluk).<\/p>\n<p>Bu iki durumu ele almak i\u00e7in, her karakteri (tek uzunluklu palindromlar i\u00e7in) ve her iki karakter aras\u0131ndaki bo\u015flu\u011fu (\u00e7ift uzunluklu palindromlar i\u00e7in) merkez olarak kabul edip geni\u015fleme yapabiliriz.<\/p>\n<p><strong>Algoritma Ad\u0131mlar\u0131:<\/strong><\/p>\n<p>1.  <code>start<\/code> ve <code>end<\/code> ad\u0131nda iki de\u011fi\u015fken tan\u0131mlay\u0131n, bunlar en uzun palindromun ba\u015flang\u0131\u00e7 ve biti\u015f indekslerini tutacakt\u0131r. Ba\u015flang\u0131\u00e7ta 0 olarak ayarlanabilirler.<br \/>\n2.  Dizinin her karakteri i\u00e7in <code>i<\/code> indeksini yineleyin (0&#8217;dan <code>s.length()-1<\/code>&#8216;e kadar).<br \/>\n3.  Her <code>i<\/code> i\u00e7in, iki ayr\u0131 geni\u015fletme i\u015flemi yap\u0131n:<br \/>\n    *   <code>expandAroundCenter(s, i, i)<\/code>: Tek uzunluklu palindromlar i\u00e7in (merkez tek bir karakterdir).<br \/>\n    *   <code>expandAroundCenter(s, i, i + 1)<\/code>: \u00c7ift uzunluklu palindromlar i\u00e7in (merkez iki karakter aras\u0131ndad\u0131r).<br \/>\n4.  <code>expandAroundCenter<\/code> metodu, verilen <code>left<\/code> ve <code>right<\/code> indekslerinden ba\u015flayarak d\u0131\u015far\u0131 do\u011fru geni\u015fler. Geni\u015fleme, <code>s.charAt(left) == s.charAt(right)<\/code> oldu\u011fu s\u00fcrece devam eder. Her ad\u0131mda <code>left<\/code> azal\u0131r ve <code>right<\/code> artar.<br \/>\n5.  Geni\u015fleme durdu\u011funda, <code>right - left - 1<\/code> bize bulunan palindromun uzunlu\u011funu verir.<br \/>\n6.  E\u011fer bu uzunluk, \u015fu ana kadar bulunan en uzun palindromun (<code>end - start + 1<\/code>) uzunlu\u011fundan b\u00fcy\u00fckse, <code>start<\/code> ve <code>end<\/code> de\u011ferlerini g\u00fcncelleyin.<br \/>\n7.  T\u00fcm merkezler kontrol edildikten sonra, <code>s.substring(start, end + 1)<\/code> sonucunu d\u00f6nd\u00fcr\u00fcn.<\/p>\n<p><strong>Uygulama Detaylar\u0131 ve Karma\u015f\u0131kl\u0131k Analizi:<\/strong><\/p>\n<p>*   D\u00f6ng\u00fc <code>i<\/code> i\u00e7in $N$ kez \u00e7al\u0131\u015f\u0131r.<br \/>\n*   Her <code>i<\/code> i\u00e7in, <code>expandAroundCenter<\/code> metodu en k\u00f6t\u00fc durumda $N\/2$ kez geni\u015fleme yapar. Bu, her <code>expandAroundCenter<\/code> \u00e7a\u011fr\u0131s\u0131 i\u00e7in $O(N)$ zaman karma\u015f\u0131kl\u0131\u011f\u0131 anlam\u0131na gelir.<br \/>\n<em>   \u0130ki <code>expandAroundCenter<\/code> \u00e7a\u011fr\u0131s\u0131 oldu\u011fu i\u00e7in, toplam zaman karma\u015f\u0131kl\u0131\u011f\u0131 $O(N <\/em> N) = O(N^2)$ olur.<br \/>\n*   Alan karma\u015f\u0131kl\u0131\u011f\u0131 ise, sadece birka\u00e7 de\u011fi\u015fken kullan\u0131ld\u0131\u011f\u0131 i\u00e7in $O(1)$&#8217;dir (dize manip\u00fclasyonlar\u0131 hari\u00e7, \u00e7\u00fcnk\u00fc <code>substring<\/code> metodu yeni dize olu\u015fturur ama bu genellikle algoritman\u0131n \u00e7ekirde\u011fi olarak say\u0131lmaz). Bu, kaba kuvvet yakla\u015f\u0131m\u0131na g\u00f6re \u00f6nemli bir iyile\u015fmedir.<\/p>\n<p><strong>Java Kod \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-java\">public class LongestPalindromicSubstring {\n\n    private int maxLen = 0;\n    private int start = 0;\n\n    \/\/ Merkezden Geni\u015fletme Yard\u0131mc\u0131 Metodu\n    private void expandAroundCenter(String s, int left, int right) {\n        while (left >= 0 && right < s.length() &#038;&#038; s.charAt(left) == s.charAt(right)) {\n            left--;\n            right++;\n        }\n        \/\/ D\u00f6ng\u00fc bitti\u011finde, left ve right bir ad\u0131m fazla gitmi\u015ftir.\n        \/\/ Palindromun ger\u00e7ek ba\u015flang\u0131c\u0131 left + 1, biti\u015fi right - 1'dir.\n        \/\/ Uzunluk: (right - 1) - (left + 1) + 1 = right - left - 1\n        if (maxLen < right - left - 1) {\n            start = left + 1;\n            maxLen = right - left - 1;\n        }\n    }\n\n    \/\/ Merkezden Geni\u015fletme Yakla\u015f\u0131m\u0131\n    public String longestPalindromeExpandAroundCenter(String s) {\n        if (s == null || s.length() < 1) {\n            return \"\";\n        }\n\n        for (int i = 0; i < s.length(); i++) {\n            \/\/ Tek uzunluklu palindromlar i\u00e7in (merkez: s[i])\n            expandAroundCenter(s, i, i);\n            \/\/ \u00c7ift uzunluklu palindromlar i\u00e7in (merkez: s[i] ve s[i+1] aras\u0131)\n            expandAroundCenter(s, i, i + 1);\n        }\n\n        return s.substring(start, start + maxLen);\n    }\n\n    \/\/ main metodu \u00f6rnek kullan\u0131m i\u00e7in\n    public static void main(String[] args) {\n        LongestPalindromicSubstring solver = new LongestPalindromicSubstring();\n\n        System.out.println(\"Expand Around Center:\");\n        System.out.println(\"babad -> \" + solver.longestPalindromeExpandAroundCenter(\"babad\")); \/\/ bab veya aba\n        System.out.println(\"cbbd -> \" + solver.longestPalindromeExpandAroundCenter(\"cbbd\"));   \/\/ bb\n        System.out.println(\"a -> \" + solver.longestPalindromeExpandAroundCenter(\"a\"));       \/\/ a\n        System.out.println(\"ac -> \" + solver.longestPalindromeExpandAroundCenter(\"ac\"));      \/\/ a\n        System.out.println(\"forgeeksskeegfor -> \" + solver.longestPalindromeExpandAroundCenter(\"forgeeksskeegfor\")); \/\/ geeksskeeg\n    }\n}<\/code><\/pre>\n<p>### Dinamik Programlama (Dynamic Programming) Yakla\u015f\u0131m\u0131<\/p>\n<p>Dinamik programlama (DP), bir problemi daha k\u00fc\u00e7\u00fck, \u00f6rt\u00fc\u015fen alt problemlere b\u00f6lerek ve bu alt problemlerin \u00e7\u00f6z\u00fcmlerini depolayarak karma\u015f\u0131k problemleri \u00e7\u00f6zmek i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir tekniktir. LPS probleminde, bir alt dizenin palindrom olup olmad\u0131\u011f\u0131n\u0131 belirlemek i\u00e7in, daha k\u00fc\u00e7\u00fck alt dizelerin palindrom olup olmad\u0131\u011f\u0131n\u0131 bilmek bize yard\u0131mc\u0131 olabilir.<\/p>\n<p><strong>Temel Fikir:<\/strong><\/p>\n<p><code>dp[i][j]<\/code> ad\u0131nda bir boolean matrisi olu\u015ftural\u0131m. <code>dp[i][j]<\/code>, <code>s[i...j]<\/code> alt dizesinin bir palindrom olup olmad\u0131\u011f\u0131n\u0131 true\/false olarak tutacakt\u0131r.<\/p>\n<p><strong>Tekrarlayan \u0130li\u015fki (Recurrence Relation):<\/strong><\/p>\n<p><code>s[i...j]<\/code> alt dizesinin bir palindrom olmas\u0131 i\u00e7in iki ko\u015fulun sa\u011flanmas\u0131 gerekir:<br \/>\n1.  <code>s[i]<\/code> karakteri ile <code>s[j]<\/code> karakteri birbirine e\u015fit olmal\u0131d\u0131r.<br \/>\n2.  <code>s[i+1...j-1]<\/code> alt dizesi de bir palindrom olmal\u0131d\u0131r.<\/p>\n<p>Bu durumda, <code>dp[i][j] = (s.charAt(i) == s.charAt(j)) && dp[i+1][j-1]<\/code> olur.<\/p>\n<p><strong>Temel Durumlar (Base Cases):<\/strong><\/p>\n<p>*   <strong>Tek karakterli alt dizeler:<\/strong> Her tek karakterli alt dize bir palindromdur. Yani, <code>dp[i][i] = true<\/code> t\u00fcm <code>i<\/code>&#8216;ler i\u00e7in.<br \/>\n*   <strong>\u0130ki karakterli alt dizeler:<\/strong> <code>s[i...i+1]<\/code> bir palindromdur e\u011fer <code>s.charAt(i) == s.charAt(i+1)<\/code> ise. Yani, <code>dp[i][i+1] = (s.charAt(i) == s.charAt(i+1))<\/code> t\u00fcm <code>i<\/code>&#8216;ler i\u00e7in.<\/p>\n<p><strong>Tablo Doldurma S\u0131ras\u0131:<\/strong><\/p>\n<p><code>dp[i+1][j-1]<\/code> de\u011ferine ihtiya\u00e7 duydu\u011fumuz i\u00e7in, matrisi doldururken alt dizelerin uzunlu\u011funa g\u00f6re artan s\u0131rada ilerlememiz gerekir. Yani, \u00f6nce uzunlu\u011fu 1 olan alt dizeler, sonra 2 olanlar, sonra 3 olanlar vb.<\/p>\n<p><strong>Algoritma Ad\u0131mlar\u0131:<\/strong><\/p>\n<p>1.  <code>N<\/code> boyutunda bir dize i\u00e7in <code>N x N<\/code> boyutunda <code>dp<\/code> boolean matrisi olu\u015fturun.<br \/>\n2.  <code>longestPalindrome<\/code> ve <code>maxLength<\/code> de\u011fi\u015fkenlerini ba\u015flat\u0131n (\u00f6rne\u011fin, ilk karakteri ba\u015flang\u0131\u00e7 palindromu olarak alabilirsiniz).<br \/>\n3.  <strong>Uzunluk 1:<\/strong> T\u00fcm <code>dp[i][i]<\/code> de\u011ferlerini <code>true<\/code> olarak ayarlay\u0131n.<br \/>\n4.  <strong>Uzunluk 2:<\/strong> <code>i<\/code>&#8216;den <code>N-2<\/code>&#8216;ye kadar d\u00f6ng\u00fc yap\u0131n. E\u011fer <code>s.charAt(i) == s.charAt(i+1)<\/code> ise, <code>dp[i][i+1] = true<\/code> olarak ayarlay\u0131n ve <code>maxLength<\/code> ile <code>longestPalindrome<\/code>&#8216;\u0131 g\u00fcncelleyin.<br \/>\n5.  <strong>Uzunluk 3&#8217;ten N&#8217;e kadar:<\/strong> <code>len<\/code> (alt dize uzunlu\u011fu) 3&#8217;ten <code>N<\/code>&#8216;e kadar d\u00f6ng\u00fc yap\u0131n.<br \/>\n    *   Her <code>len<\/code> i\u00e7in, <code>i<\/code> (ba\u015flang\u0131\u00e7 indeksi) 0&#8217;dan <code>N - len<\/code>&#8216;e kadar d\u00f6ng\u00fc yap\u0131n.<br \/>\n    *   <code>j<\/code> (biti\u015f indeksi) <code>i + len - 1<\/code> olarak hesaplay\u0131n.<br \/>\n    *   E\u011fer <code>s.charAt(i) == s.charAt(j)<\/code> ve <code>dp[i+1][j-1]<\/code> true ise, <code>dp[i][j] = true<\/code> olarak ayarlay\u0131n.<br \/>\n    *   E\u011fer <code>dp[i][j]<\/code> true ise ve <code>len<\/code> \u015fu anki <code>maxLength<\/code>&#8216;ten b\u00fcy\u00fckse, <code>maxLength<\/code> ve <code>longestPalindrome<\/code>&#8216;\u0131 g\u00fcncelleyin.<br \/>\n6.  Son olarak, <code>longestPalindrome<\/code>&#8216;\u0131 d\u00f6nd\u00fcr\u00fcn.<\/p>\n<p><strong>Uygulama Detaylar\u0131 ve Karma\u015f\u0131kl\u0131k Analizi:<\/strong><\/p>\n<p>*   DP tablosunu doldurmak i\u00e7in i\u00e7 i\u00e7e \u00fc\u00e7 d\u00f6ng\u00fc vard\u0131r: <code>len<\/code> (uzunluk), <code>i<\/code> (ba\u015flang\u0131\u00e7 indeksi) ve <code>j<\/code> (biti\u015f indeksi). Ancak <code>j<\/code> <code>i<\/code> ve <code>len<\/code>&#8216;e ba\u011fl\u0131d\u0131r. Temel olarak, $N^2$ h\u00fccreyi doldururuz ve her h\u00fccreyi doldurmak sabit zaman al\u0131r.<br \/>\n*   Zaman karma\u015f\u0131kl\u0131\u011f\u0131 $O(N^2)$&#8217;dir.<br \/>\n*   Alan karma\u015f\u0131kl\u0131\u011f\u0131 ise <code>N x N<\/code> boyutundaki <code>dp<\/code> matrisi i\u00e7in $O(N^2)$&#8217;dir.<\/p>\n<p>Bu yakla\u015f\u0131m, merkezden geni\u015fletme yakla\u015f\u0131m\u0131yla ayn\u0131 zaman karma\u015f\u0131kl\u0131\u011f\u0131na sahip olsa da, daha fazla alan kullan\u0131r. Ancak, dinamik programlama kavram\u0131n\u0131 anlamak i\u00e7in iyi bir \u00f6rnektir.<\/p>\n<p><strong>Java Kod \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-java\">public class LongestPalindromicSubstring {\n\n    \/\/ Dinamik Programlama Yakla\u015f\u0131m\u0131\n    public String longestPalindromeDP(String s) {\n        if (s == null || s.length() < 1) {\n            return \"\";\n        }\n\n        int n = s.length();\n        boolean[][] dp = new boolean[n][n]; \/\/ dp[i][j] true ise s[i...j] bir palindromdur\n\n        String longestPalindrome = \"\";\n        int maxLength = 0;\n\n        \/\/ Tek karakterli alt dizeler her zaman palindromdur (uzunluk = 1)\n        for (int i = 0; i < n; i++) {\n            dp[i][i] = true;\n            if (1 > maxLength) {\n                maxLength = 1;\n                longestPalindrome = s.substring(i, i + 1);\n            }\n        }\n\n        \/\/ \u0130ki karakterli alt dizeler (uzunluk = 2)\n        for (int i = 0; i < n - 1; i++) {\n            if (s.charAt(i) == s.charAt(i + 1)) {\n                dp[i][i + 1] = true;\n                if (2 > maxLength) {\n                    maxLength = 2;\n                    longestPalindrome = s.substring(i, i + 2);\n                }\n            }\n        }\n\n        \/\/ Uzunluk 3'ten N'e kadar olan alt dizeler\n        for (int len = 3; len <= n; len++) {\n            for (int i = 0; i <= n - len; i++) {\n                int j = i + len - 1; \/\/ Biti\u015f indeksi\n\n                \/\/ s[i...j] bir palindrom mu?\n                \/\/ s[i] == s[j] OLMALI VE s[i+1...j-1] B\u0130R PAL\u0130NDROM OLMALI\n                if (s.charAt(i) == s.charAt(j) &#038;&#038; dp[i + 1][j - 1]) {\n                    dp[i][j] = true;\n                    if (len > maxLength) {\n                        maxLength = len;\n                        longestPalindrome = s.substring(i, j + 1);\n                    }\n                }\n            }\n        }\n        return longestPalindrome;\n    }\n\n    \/\/ main metodu \u00f6rnek kullan\u0131m i\u00e7in\n    public static void main(String[] args) {\n        LongestPalindromicSubstring solver = new LongestPalindromicSubstring();\n\n        System.out.println(\"Dynamic Programming:\");\n        System.out.println(\"babad -> \" + solver.longestPalindromeDP(\"babad\")); \/\/ bab veya aba\n        System.out.println(\"cbbd -> \" + solver.longestPalindromeDP(\"cbbd\"));   \/\/ bb\n        System.out.println(\"a -> \" + solver.longestPalindromeDP(\"a\"));       \/\/ a\n        System.out.println(\"ac -> \" + solver.longestPalindromeDP(\"ac\"));      \/\/ a\n        System.out.println(\"forgeeksskeegfor -> \" + solver.longestPalindromeDP(\"forgeeksskeegfor\")); \/\/ geeksskeeg\n    }\n}<\/code><\/pre>\n<p>### Manacher Algoritmas\u0131 (Geli\u015fmi\u015f ve Optimal Yakla\u015f\u0131m)<\/p>\n<p>\u015eimdiye kadar inceledi\u011fimiz algoritmalar $O(N^2)$ zaman karma\u015f\u0131kl\u0131\u011f\u0131na sahipti. Ancak, &#8220;Longest Palindromic Substring&#8221; problemi i\u00e7in $O(N)$ zaman karma\u015f\u0131kl\u0131\u011f\u0131na sahip do\u011frusal bir \u00e7\u00f6z\u00fcm mevcuttur: Manacher Algoritmas\u0131. Bu algoritma, daha \u00f6nce hesaplanm\u0131\u015f palindrom bilgilerini ak\u0131ll\u0131ca kullanarak gereksiz tekrarlayan kontrolleri \u00f6nler.<\/p>\n<p><strong>Neden O(N) karma\u015f\u0131kl\u0131\u011f\u0131na ihtiya\u00e7 duyar\u0131z?<\/strong><\/p>\n<p>$N^2$ algoritmalar genellikle $N$&#8217;in 1000-5000 aral\u0131\u011f\u0131nda oldu\u011fu durumlar i\u00e7in kabul edilebilir olabilir. Ancak, $N$ 10.000 veya daha b\u00fcy\u00fck oldu\u011funda $N^2$ \u00e7\u00f6z\u00fcmler \u00e7ok yava\u015flar. O(N) \u00e7\u00f6z\u00fcmler, bu t\u00fcr b\u00fcy\u00fck veri setlerinde bile h\u0131zl\u0131 yan\u0131t s\u00fcreleri sa\u011flar ve genellikle daha sofistike problem \u00e7\u00f6zme tekniklerinin bir g\u00f6stergesidir.<\/p>\n<p><strong>Ana Fikir:<\/strong><\/p>\n<p>Manacher algoritmas\u0131n\u0131n temel fikri, bir palindromun simetrisinden yararlanmakt\u0131r. Bir palindromun bir b\u00f6l\u00fcm\u00fcn\u00fc zaten biliyorsak, onun simetrik kar\u015f\u0131l\u0131\u011f\u0131n\u0131n da bir palindrom olaca\u011f\u0131n\u0131 varsayabiliriz. Bu bilgi, yeni palindromlar\u0131 ke\u015ffederken ba\u015flang\u0131\u00e7 noktam\u0131z\u0131 optimize etmemizi sa\u011flar.<\/p>\n<p><strong>\u00d6n \u0130\u015fleme (Preprocessing):<\/strong><\/p>\n<p>Manacher algoritmas\u0131, tek ve \u00e7ift uzunluklu palindromlar\u0131 ayn\u0131 \u015fekilde ele almak i\u00e7in giri\u015f dizisini d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Her karakter aras\u0131na ve dizenin ba\u015f\u0131na\/sonuna \u00f6zel bir karakter (\u00f6rne\u011fin &#8216;#&#8217;) eklenir. Bu, t\u00fcm palindromlar\u0131n yeni dizede tek uzunluklu olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6rnek:<br \/>\n*   &#8220;babad&#8221; -> &#8220;#b#a#b#a#d#&#8221; (uzunluk 5 -> 11)<br \/>\n*   &#8220;cbbd&#8221; -> &#8220;#c#b#b#d#&#8221; (uzunluk 4 -> 9)<\/p>\n<p>Bu d\u00f6n\u00fc\u015f\u00fcm, her palindromun art\u0131k bir merkezi karaktere sahip olmas\u0131n\u0131 sa\u011flar, bu da algoritmay\u0131 basitle\u015ftirir.<\/p>\n<p><strong>Algoritma Ad\u0131mlar\u0131:<\/strong><\/p>\n<p>1.  <strong>Dizeyi D\u00f6n\u00fc\u015ft\u00fcr:<\/strong> Yukar\u0131da a\u00e7\u0131kland\u0131\u011f\u0131 gibi, giri\u015f dizisini \u00f6zel karakterlerle geni\u015fletin. D\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dizeye <code>T<\/code> diyelim. <code>T<\/code>&#8216;nin uzunlu\u011fu <code>2*N + 1<\/code> olacakt\u0131r.<br \/>\n2.  <strong><code>P<\/code> Dizisi:<\/strong> <code>P[i]<\/code> ad\u0131nda bir dizi olu\u015fturun. <code>P[i]<\/code>, <code>T[i]<\/code> merkezli en uzun palindromun yar\u0131 uzunlu\u011funu (veya yar\u0131 \u00e7ap\u0131n\u0131) tutacakt\u0131r. \u00d6rne\u011fin, <code>T[i]<\/code> merkezli palindrom <code>T[i-P[i]...i+P[i]]<\/code> ise, <code>P[i]<\/code> bu palindromun <code>i<\/code>&#8216;den ne kadar uzand\u0131\u011f\u0131n\u0131 g\u00f6sterir (kendi dahil).<br \/>\n3.  <strong><code>C<\/code> (Center) ve <code>R<\/code> (Right Boundary):<\/strong><br \/>\n    *   <code>C<\/code>: \u015eu ana kadar bulunan ve en sa\u011fa uzanan palindromun merkezi.<br \/>\n    *   <code>R<\/code>: <code>C<\/code> merkezli palindromun sa\u011f s\u0131n\u0131r\u0131 (<code>C + P[C]<\/code>).<\/p>\n<p>4.  <strong>\u0130terasyon:<\/strong> <code>T<\/code> dizisi \u00fczerinde <code>i<\/code> (0&#8217;dan <code>T.length()-1<\/code>&#8216;e kadar) ile d\u00f6ng\u00fc yap\u0131n.<br \/>\n    <em>   <strong>Simetrik \u0130ndeks (<code>i_mirror<\/code>):<\/strong> <code>i_mirror = 2<\/em>C - i<\/code>. Bu, <code>i<\/code>&#8216;nin <code>C<\/code>&#8216;ye g\u00f6re simetrik indeksidir.<br \/>\n    *   <strong>Minimum Palindrom Yar\u0131\u00e7ap\u0131:<\/strong> <code>i<\/code>&#8216;deki palindromun en az <code>min(P[i_mirror], R - i)<\/code> kadar olaca\u011f\u0131n\u0131 biliyoruz. E\u011fer <code>i<\/code> <code>R<\/code>&#8216;nin i\u00e7indeyse, <code>P[i]<\/code>&#8216;nin ba\u015flang\u0131\u00e7 de\u011feri bu minimum de\u011ferdir. E\u011fer <code>i<\/code> <code>R<\/code>&#8216;nin d\u0131\u015f\u0131ndaysa, <code>P[i]<\/code> ba\u015flang\u0131\u00e7ta 0&#8217;d\u0131r.<br \/>\n    *   <strong>Geni\u015fletme:<\/strong> <code>T[i - P[i] - 1] == T[i + P[i] + 1]<\/code> oldu\u011fu s\u00fcrece <code>P[i]<\/code>&#8216;yi art\u0131r\u0131n. (S\u0131n\u0131r kontrollerini unutmay\u0131n: <code>i - P[i] - 1 >= 0<\/code> ve <code>i + P[i] + 1 < T.length()<\/code>).<br \/>\n    *   <strong><code>C<\/code> ve <code>R<\/code> G\u00fcncellemesi:<\/strong> E\u011fer <code>i + P[i]<\/code> de\u011feri <code>R<\/code>'den b\u00fcy\u00fckse (yani yeni bulunan palindrom daha sa\u011fa uzan\u0131yorsa), <code>C<\/code>'yi <code>i<\/code>'ye ve <code>R<\/code>'yi <code>i + P[i]<\/code>'ye g\u00fcncelleyin.<\/p>\n<p>5.  <strong>En Uzun Palindromu Bul:<\/strong> <code>P<\/code> dizisindeki en b\u00fcy\u00fck de\u011feri (<code>maxLen<\/code>) bulun. Bu <code>maxLen<\/code>, d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dizedeki en uzun palindromun yar\u0131\u00e7ap\u0131d\u0131r.<br \/>\n    *   En uzun palindromun merkezi <code>maxCenter<\/code> olacakt\u0131r.<br \/>\n    *   Orijinal dizedeki ba\u015flang\u0131\u00e7 indeksi <code>(maxCenter - maxLen) \/ 2<\/code> olacakt\u0131r.<br \/>\n    *   Orijinal dizedeki uzunluk <code>maxLen<\/code> olacakt\u0131r.<\/p>\n<p>6.  Sonucu d\u00f6nd\u00fcr\u00fcn: <code>s.substring(start, start + maxLen)<\/code>.<\/p>\n<p><strong>Uygulama Detaylar\u0131 ve Karma\u015f\u0131kl\u0131k Analizi:<\/strong><\/p>\n<p>*   Dizeyi d\u00f6n\u00fc\u015ft\u00fcrmek $O(N)$ zaman al\u0131r.<br \/>\n*   Ana d\u00f6ng\u00fc $N'$ (d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dizenin uzunlu\u011fu, yakla\u015f\u0131k $2N$) kez \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <code>P[i]<\/code>'nin her art\u0131r\u0131lmas\u0131 (geni\u015fletme ad\u0131m\u0131) toplamda <code>N'<\/code> kez ger\u00e7ekle\u015fir. Bu, amortize edilmi\u015f analize g\u00f6re her karakterin sadece sabit say\u0131da kez ziyaret edildi\u011fi anlam\u0131na gelir.<br \/>\n*   Zaman karma\u015f\u0131kl\u0131\u011f\u0131 $O(N)$'dir.<br \/>\n*   Alan karma\u015f\u0131kl\u0131\u011f\u0131 <code>P<\/code> dizisi ve d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dize i\u00e7in $O(N)$'dir.<\/p>\n<p>Manacher algoritmas\u0131, teorik olarak en verimli \u00e7\u00f6z\u00fcmd\u00fcr. Ancak, uygulamas\u0131 di\u011fer yakla\u015f\u0131mlara g\u00f6re daha karma\u015f\u0131kt\u0131r.<\/p>\n<p><strong>Java Kod \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-java\">public class LongestPalindromicSubstring {\n\n    \/\/ Manacher Algoritmas\u0131\n    public String longestPalindromeManacher(String s) {\n        if (s == null || s.length() == 0) {\n            return \"\";\n        }\n\n        \/\/ 1. Dizeyi \u00d6n \u0130\u015fleme (Preprocessing)\n        \/\/ Her karakter aras\u0131na ve ba\u015f\u0131na\/sonuna '#' ekleyerek\n        \/\/ t\u00fcm palindromlar\u0131 tek uzunluklu hale getiriyoruz.\n        StringBuilder t = new StringBuilder();\n        t.append('$'); \/\/ Ba\u015flang\u0131\u00e7 i\u015fareti (s\u0131n\u0131r kontrol\u00fc i\u00e7in)\n        t.append('#');\n        for (char c : s.toCharArray()) {\n            t.append(c);\n            t.append('#');\n        }\n        t.append('@'); \/\/ Biti\u015f i\u015fareti (s\u0131n\u0131r kontrol\u00fc i\u00e7in)\n\n        char[] T = t.toString().toCharArray(); \/\/ D\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dize\n\n        int n = T.length;\n        int[] P = new int[n]; \/\/ P[i]: T[i] merkezli palindromun yar\u0131\u00e7ap\u0131\n        int C = 0; \/\/ Center: En sa\u011fa uzanan palindromun merkezi\n        int R = 0; \/\/ Right boundary: C merkezli palindromun sa\u011f s\u0131n\u0131r\u0131 (C + P[C])\n\n        int maxLen = 0; \/\/ En uzun palindromun yar\u0131\u00e7ap\u0131\n        int centerIndex = 0; \/\/ En uzun palindromun merkez indeksi\n\n        for (int i = 1; i < n - 1; i++) { \/\/ '$' ve '@' i\u015faretlerini atl\u0131yoruz\n            \/\/ i_mirror: i'nin C'ye g\u00f6re simetrik indeksi\n            int i_mirror = 2 * C - i;\n\n            \/\/ E\u011fer i, R'nin i\u00e7indeyse, P[i] en az min(P[i_mirror], R - i) olabilir\n            \/\/ De\u011filse, P[i] ba\u015flang\u0131\u00e7ta 0'd\u0131r (tek karakterli palindrom)\n            if (R > i) {\n                P[i] = Math.min(R - i, P[i_mirror]);\n            } else {\n                P[i] = 0;\n            }\n\n            \/\/ Merkezden geni\u015fle\n            \/\/ T[i - P[i] - 1] == T[i + P[i] + 1] oldu\u011fu s\u00fcrece P[i]'yi art\u0131r\n            while (T[i + P[i] + 1] == T[i - P[i] - 1]) {\n                P[i]++;\n            }\n\n            \/\/ E\u011fer yeni bulunan palindrom R'yi a\u015f\u0131yorsa, C ve R'yi g\u00fcncelle\n            if (i + P[i] > R) {\n                C = i;\n                R = i + P[i];\n            }\n\n            \/\/ En uzun palindromu g\u00fcncelle\n            if (P[i] > maxLen) {\n                maxLen = P[i];\n                centerIndex = i;\n            }\n        }\n\n        \/\/ Orijinal dizedeki en uzun palindromu \u00e7\u0131kar\n        \/\/ centerIndex: D\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dizedeki merkezin indeksi\n        \/\/ maxLen: D\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f dizedeki palindromun yar\u0131\u00e7ap\u0131\n        \/\/ Orijinal dizedeki ba\u015flang\u0131\u00e7 indeksi: (centerIndex - maxLen) \/ 2\n        \/\/ Orijinal dizedeki uzunluk: maxLen\n        int startIndex = (centerIndex - maxLen) \/ 2;\n        return s.substring(startIndex, startIndex + maxLen);\n    }\n\n    \/\/ main metodu \u00f6rnek kullan\u0131m i\u00e7in\n    public static void main(String[] args) {\n        LongestPalindromicSubstring solver = new LongestPalindromicSubstring();\n\n        System.out.println(\"Manacher Algorithm:\");\n        System.out.println(\"babad -> \" + solver.longestPalindromeManacher(\"babad\")); \/\/ bab\n        System.out.println(\"cbbd -> \" + solver.longestPalindromeManacher(\"cbbd\"));   \/\/ bb\n        System.out.println(\"a -> \" + solver.longestPalindromeManacher(\"a\"));       \/\/ a\n        System.out.println(\"ac -> \" + solver.longestPalindromeManacher(\"ac\"));      \/\/ a\n        System.out.println(\"forgeeksskeegfor -> \" + solver.longestPalindromeManacher(\"forgeeksskeegfor\")); \/\/ geeksskeeg\n        System.out.println(\"racecar -> \" + solver.longestPalindromeManacher(\"racecar\")); \/\/ racecar\n        System.out.println(\"abba -> \" + solver.longestPalindromeManacher(\"abba\")); \/\/ abba\n    }\n}<\/code><\/pre>\n<p>### Yakla\u015f\u0131mlar\u0131n Kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131<\/p>\n<p>Farkl\u0131 algoritmik yakla\u015f\u0131mlar\u0131 bir tablo halinde kar\u015f\u0131la\u015ft\u0131rmak, her birinin avantajlar\u0131n\u0131 ve dezavantajlar\u0131n\u0131 net bir \u015fekilde g\u00f6rmemizi sa\u011flar:<\/p>\n<p>| Yakla\u015f\u0131m              | Zaman Karma\u015f\u0131kl\u0131\u011f\u0131 | Alan Karma\u015f\u0131kl\u0131\u011f\u0131 | Uygulama Kolayl\u0131\u011f\u0131 | A\u00e7\u0131klama                                                                |<br \/>\n| :-------------------- | :----------------- | :---------------- | :----------------- | :---------------------------------------------------------------------- |<br \/>\n| <strong>Brute-Force<\/strong>       | $O(N^3)$           | $O(N)$            | \u00c7ok Kolay          | T\u00fcm alt dizeleri kontrol eder, en yava\u015f y\u00f6ntem.                         |<br \/>\n| <strong>Merkezden Geni\u015fletme<\/strong> | $O(N^2)$           | $O(1)$            | Orta               | Her olas\u0131 merkezden d\u0131\u015far\u0131 do\u011fru geni\u015fler, pratikte iyi performans.     |<br \/>\n| <strong>Dinamik Programlama<\/strong> | $O(N^2)$           | $O(N^2)$          | Orta               | Alt problem \u00e7\u00f6z\u00fcmlerini depolayarak tekrar hesaplamalar\u0131 \u00f6nler.         |<br \/>\n| <strong>Manacher Algoritmas\u0131<\/strong> | $O(N)$             | $O(N)$            | Zor                | En verimli y\u00f6ntem, \u00f6zel \u00f6n i\u015fleme ve simetri kullan\u0131r.                  |<\/p>\n<p><strong>Hangi Yakla\u015f\u0131m Ne Zaman Kullan\u0131lmal\u0131?<\/strong><\/p>\n<p>*   <strong>Brute-Force:<\/strong> Sadece \u00e7ok k\u00fc\u00e7\u00fck <code>N<\/code> de\u011ferleri i\u00e7in veya bir kavram\u0131 h\u0131zl\u0131ca test etmek i\u00e7in kullan\u0131l\u0131r. Genellikle pratik uygulamalar i\u00e7in \u00f6nerilmez.<br \/>\n*   <strong>Merkezden Geni\u015fletme:<\/strong> <code>N^2<\/code> \u00e7\u00f6z\u00fcmlerin yeterli oldu\u011fu \u00e7o\u011fu pratik senaryo i\u00e7in iyi bir se\u00e7enektir. Uygulamas\u0131 nispeten kolayd\u0131r ve $O(1)$ alan karma\u015f\u0131kl\u0131\u011f\u0131 ile haf\u0131za dostudur.<br \/>\n*   <strong>Dinamik Programlama:<\/strong> <code>N^2<\/code> \u00e7\u00f6z\u00fcmlerin yeterli oldu\u011fu ve DP kavram\u0131n\u0131n anla\u015f\u0131lmas\u0131n\u0131n istendi\u011fi durumlarda kullan\u0131labilir. Ancak, $O(N^2)$ alan karma\u015f\u0131kl\u0131\u011f\u0131 nedeniyle haf\u0131za k\u0131s\u0131tlamalar\u0131 olan durumlarda dikkatli olunmal\u0131d\u0131r.<br \/>\n*   <strong>Manacher Algoritmas\u0131:<\/strong> <code>N<\/code> \u00e7ok b\u00fcy\u00fck oldu\u011funda ve en y\u00fcksek performans\u0131n gerekti\u011fi durumlarda tercih edilir. Uygulamas\u0131 karma\u015f\u0131k oldu\u011fu i\u00e7in, sadece performans kritik durumlarda veya algoritmik bir meydan okuma olarak d\u00fc\u015f\u00fcn\u00fclmelidir.<\/p>\n<p>### Uygulama Alanlar\u0131<\/p>\n<p>Longest Palindromic Substring problemi ve onun \u00e7\u00f6z\u00fcmleri, \u00e7e\u015fitli ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulama bulur:<\/p>\n<p>*   <strong>Biyoinformatik:<\/strong> DNA ve RNA dizileri genellikle palindromik veya ters tekrarlayan b\u00f6lgeler i\u00e7erir. Bu b\u00f6lgelerin tespiti, genetik d\u00fczenleme, protein ba\u011flama siteleri ve hastal\u0131k te\u015fhisi gibi biyolojik s\u00fcre\u00e7leri anlamada kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Metin \u0130\u015fleme ve Dize E\u015fle\u015ftirme:<\/strong> B\u00fcy\u00fck metin veri k\u00fcmelerinde palindromik desenleri bulmak, do\u011fal dil i\u015fleme (NLP) ve metin madencili\u011fi uygulamalar\u0131nda kullan\u0131labilir. \u00d6rne\u011fin, metinlerdeki belirli yap\u0131lar\u0131 veya anlamsal \u00f6zelliklere sahip b\u00f6lgeleri tan\u0131mlamak.<br \/>\n*   <strong>Veri S\u0131k\u0131\u015ft\u0131rma:<\/strong> Palindromik alt dizelerin tespiti, veri s\u0131k\u0131\u015ft\u0131rma algoritmalar\u0131nda tekrarlayan desenleri bulmak ve bunlar\u0131 daha verimli bir \u015fekilde temsil etmek i\u00e7in bir \u00f6n ad\u0131m olabilir.<br \/>\n*   <strong>Algoritma Tasar\u0131m\u0131 Prensip \u00d6rne\u011fi:<\/strong> Bu problem, dinamik programlama, a\u00e7g\u00f6zl\u00fc algoritmalar ve do\u011frusal zaman algoritmalar\u0131 gibi farkl\u0131 algoritma tasar\u0131m paradigmalar\u0131n\u0131 \u00f6\u011fretmek ve kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in m\u00fckemmel bir \u00f6rnektir. \u00d6\u011frencilerin ve geli\u015ftiricilerin algoritmik d\u00fc\u015f\u00fcnme becerilerini geli\u015ftirmelerine yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Kriptografi:<\/strong> Belirli dize desenlerinin analizi, kriptografik algoritmalar\u0131n zay\u0131fl\u0131klar\u0131n\u0131 veya g\u00fc\u00e7l\u00fc y\u00f6nlerini anlamak i\u00e7in kullan\u0131labilir.<\/p>\n<p>### Sonu\u00e7<\/p>\n<p>Bu makalede, verilen bir dize i\u00e7indeki en uzun palindromik alt dizeyi bulma problemine odakland\u0131k. Kaba kuvvet, merkezden geni\u015fletme, dinamik programlama ve Manacher algoritmas\u0131 gibi d\u00f6rt farkl\u0131 yakla\u015f\u0131m\u0131 detayl\u0131 bir \u015fekilde inceledik. Her bir algoritman\u0131n \u00e7al\u0131\u015fma prensibini, zaman ve alan karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ve Java dilinde uygulan\u0131\u015f\u0131n\u0131 \u00f6rnek kodlarla birlikte sunduk.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, kaba kuvvet yakla\u015f\u0131m\u0131 basit olmas\u0131na ra\u011fmen y\u00fcksek karma\u015f\u0131kl\u0131\u011f\u0131 nedeniyle pratik de\u011fildir. Merkezden geni\u015fletme ve dinamik programlama yakla\u015f\u0131mlar\u0131 $O(N^2)$ zaman karma\u015f\u0131kl\u0131\u011f\u0131na sahip olup, bir\u00e7ok senaryo i\u00e7in kabul edilebilir performans sunar. Ancak, b\u00fcy\u00fck veri k\u00fcmeleri i\u00e7in en optimal \u00e7\u00f6z\u00fcm, $O(N)$ zaman karma\u015f\u0131kl\u0131\u011f\u0131na sahip olan Manacher algoritmas\u0131d\u0131r. Manacher algoritmas\u0131, \u00f6n i\u015fleme ve simetri \u00f6zelliklerini ak\u0131ll\u0131ca kullanarak tekrarlayan hesaplamalardan ka\u00e7\u0131n\u0131r ve do\u011frusal zamanda \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Bu problemin \u00e7\u00f6z\u00fcm\u00fc, algoritmik d\u00fc\u015f\u00fcnmenin ve farkl\u0131 problem \u00e7\u00f6zme stratejilerinin \u00f6nemini vurgular. Algoritmalar\u0131n karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 anlamak ve bir problem i\u00e7in en uygun \u00e7\u00f6z\u00fcm\u00fc se\u00e7mek, verimli ve \u00f6l\u00e7eklenebilir yaz\u0131l\u0131m geli\u015ftirmek i\u00e7in temel bir beceridir. Longest Palindromic Substring gibi klasik problemler, bu becerileri geli\u015ftirmek ve teorik bilgiyi pratik uygulamalara d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in de\u011ferli bir zemin sa\u011flar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)\n### Giri\u015f\nBilgisayar bilimlerinde ve yaz\u0131l\u0131m geli\u015ftirmede dize (string) manip\u00fclasyonu, bir","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-34621","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)\" \/>\n<meta property=\"og:description\" content=\"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java) ### Giri\u015f Bilgisayar bilimlerinde ve yaz\u0131l\u0131m geli\u015ftirmede dize (string) manip\u00fclasyonu, bir\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-19T19:40:56+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)\",\"datePublished\":\"2025-11-19T19:40:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\"},\"wordCount\":2820,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\",\"name\":\"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-19T19:40:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/","og_locale":"tr_TR","og_type":"article","og_title":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)","og_description":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java) ### Giri\u015f Bilgisayar bilimlerinde ve yaz\u0131l\u0131m geli\u015ftirmede dize (string) manip\u00fclasyonu, bir","og_url":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-19T19:40:56+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)","datePublished":"2025-11-19T19:40:56+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/"},"wordCount":2820,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/","url":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/","name":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java) - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-19T19:40:56+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dizideki-en-uzun-palindromik-alt-dizeyi-bulma-java\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Dizideki En Uzun Palindromik Alt Dizeyi Bulma (Java)"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34621","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34621"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34621\/revisions"}],"predecessor-version":[{"id":34622,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34621\/revisions\/34622"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34621"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34621"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34621"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}