THE WAY OF LONGEST PALINDROME

dokumen-dokumen yang mirip
String Matching Dalam Permainan The Hunt for Gollum

Analisis Algoritma Knuth Morris Pratt dan Algoritma Boyer Moore dalam Proses Pencarian String

Aplikasi Pohon Pencarian Biner Seimbang sebagai Memo Table Dynamic Programming

II. DASAR TEORI I. PENDAHULUAN

Penerapan Pohon dengan Algoritma Branch and Bound dalam Menyelesaikan N-Queen Problem

Penerapan Algoritma String Matching dalam Intelligent Personal Assistant Siri

Implementasi Pencocokan String Tidak Eksak dengan Algoritma Program Dinamis

Penerapan Algoritma Pencocokan String Boyer-Moore untuk Keamanan Komputer

Penerapan Algoritma Brute Force di Permainan Nonogram

Perbandingan Algoritma Brute Force dan Breadth First Search dalam Permainan Onet

Penerapan Divide and Conquer dalam Membandingkan Alur Proses 2 Source Code

Penggunaan Algoritma Knuth-Morris-Pratt untuk Pengecekan Ejaan

Pencarian Solusi Optimal dalam Permainan Congklak dengan Program Dinamis

Perbandingan Algoritma Depth-First Search dan Algoritma Hunt-and-Kill dalam Pembuatan Labirin

Penerapan Algoritma Brute-Force serta Backtracking dalam Penyelesaian Cryptarithmetic

Mencari Pola dalam Gambar dengan Algoritma Pattern Matching

Strategi Algoritma Penyelesaian Puzzle Hanjie

Penggunaan Pohon Huffman Sebagai Sarana Kompresi Lossless Data

Memecahkan Puzzle Hidato dengan Algoritma Branch and Bound

Aplikasi Rekursif dalam Analisis Sintaks Program

Aplikasi String Matching Pada Fitur Auto-Correct dan Word-Suggestion

Vigenere Minimum-Prime Key-Adding Cipher

Pemecahan Masalah Longest Increasing Subsequence Memanfaatkan Program Dinamis dan Binary Search

Analisis Pengimplementasian Algoritma Greedy untuk Memilih Rute Angkutan Umum

Penerapan Algoritma Brute Force dalam mencari Faktor Prima pada suatu Bilangan

APLIKASI ALGORITMA PENCOCOKAN STRING KNUTH-MORRIS-PRATT (KPM) DALAM PENGENALAN SIDIK JARI

Penerapan Algoritma Pattern Matching untuk Mengidentifikasi Musik Monophonic

Implementasi Logika Penurunan Persamaan Aritmatika pada Program Komputer

Penerapan Algoritma Runut-Balik untuk Menyelesaikan Permainan Pencarian Kata

Aplikasi String Matching dalam Analisis Cap Bibir

Pencocokan String dengan Algoritma Reverse Colussi

Analisis Beberapa Algoritma dalam Menyelesaikan Pencarian Jalan Terpendek

Penggunaan Algoritma DFS dan BFS pada Permainan Three Piles of Stones

Penilaian Ujian Tertulis Menggunakan Algoritma Pattern Matching IF3051 Strategi Algoritma

Aplikasi Algoritma Pencocokan String dan Algoritma Runut Balik dalam Konversi Romaji ke Hangul

II. TEORI DASAR. Kata Kunci levenshtein; program dinamis; edit distance; twitter

Perbandingan Algoritma Brute Force dan Backtracking dalam Permainan Word Search Puzzle

Aplikasi Algoritma Pencarian String Dalam Sistem Pembayaran Parkir

Penggunaan Brute Force untuk Mendeteksi Potensi Terjadinya Deadlock

Aplikasi Algoritma String Matching dan Regex untuk Validasi Formulir

Enkripsi Pesan pada dengan Menggunakan Chaos Theory

Penerapan Algoritma LZW (Lempel-Ziv-Welch) pada Program Pemampat File

PERBANDINGAN KOMPLEKSITAS ALGORITMA PENCARIAN BINER DAN ALGORITMA PENCARIAN BERUNTUN

BAB 2 TINJAUAN PUSTAKA

Perbandingan Penggunaan Algoritma BM dan Algoritma Horspool pada Pencarian String dalam Bahasa Medis

Algoritma Pencarian String dalam Pemilihan Anggota Sebuah Organisasi

Analisis Kompleksitas Algoritma dalam Operasi BigMod

Penerapan Algoritma Runut-balik pada Permainan Math Maze

Penerapan Algoritma Brute Force dan Backtracking pada Permainan Skycraper

Penerapan Algoritma Boyer Moore-Dynamic Programming untuk Layanan Auto-Complete dan Auto-Correct

Implementasi Pemrograman Dinamis dalam Pencarian Solusi Permainan Menara Hanoi

Perbandingan Algoritma Knuth-Morris-Pratt dan Algoritma Boyer-Moore dalam Pencarian Teks di Bahasa Indonesia dan Inggris

Penerapan Algoritma Greedy pada Intelegensia Buatan untuk Transfer Pemain dalam Permainan Simulasi Sepakbola

Aplikasi Algoritma Reverse Greedy pada Egyptian Fraction

Pencarian Potongan Gambar Menggunakan Algoritma Boyer Moore

Suffix Array dan Kegunaannya Dalam Memecahkan Berbagai Persoalan String

Pembangkit Kunci Acak pada One-Time Pad Menggunakan Fungsi Hash Satu-Arah

APLIKASI PEMROGRAMAN DINAMIS UNTUK MEMAKSIMALKAN PELUANG MEMENANGKAN PERMAINAN PIG

Penerapan Algoritma Greedy dalam Permainan Connect 4

Pencarian Solusi Permainan Fig-Jig Menggunakan Algoritma Runut-Balik

Menentukan Susunan Terbaik Tim Proyek dengan Algoritma Branch and Bound

Algoritma Backtracking Pada Permainan Peg Solitaire

PENERAPAN ALGORITMA PATTERN MATCHING KNUTH-MORRIS-PRATT DALAM PROGRAM MOUSE CAM

IF3051 Strategi Algoritma Penerapan Algoritma Greedy untuk Peletakan Tanaman dalam Game Harvest Moon: Back to Nature

Aplikasi Algoritma Greedy, BFS dan DFS pada Penyelesaian Permainan Mahjong Solitaire

Penerapan String Matching pada Fitur Auto Correct dan Fitur Auto Text di Smart Phones

Penggunaan Algoritma DFS dalam Pencarian Strategi Permainan Catur

Penyelesaian Masalah Closest Pair dengan Algoritma Divide and Conquer

Penggunaan Algoritma Greedy untuk Mencari Solusi Optimal dalam Permainan Brick Breaker

Penerapan Algoritma Greedy untuk Permainan Halma

Penerapan Algoritma Knuth Morris Pratt dalam Aplikasi Penerjemah Teks

Algoritma Puzzle Pencarian Kata

Penerapan Algoritma Flood Fill untuk Mengurangi Ruang Pencarian pada Pencarian Solusi Puzzle Pentomino

BAB 1 PENDAHULUAN. Universitas Sumatera Utara

Implementasi SHA untuk Komparasi File

Struktur Data adalah : suatu koleksi atau kelompok data yang dapat dikarakteristikan oleh organisasi serta operasi yang didefinisikan terhadapnya.

PENGENALAN BINARY INDEXED TREE DAN APLIKASINYA

Menyelesaikan Kakuro Puzzle dengan Kombinatorial

Permasalahan Clique dalam Graf

Struktur Data adalah : suatu koleksi atau kelompok data yang dapat dikarakteristikan oleh organisasi serta operasi yang didefinisikan terhadapnya.

Pendeteksian Deadlock dengan Algoritma Runut-balik

Aplikasi Algoritma Greedy untuk Pergerakan Musuh pada Permainan Pac-Man

Penerapan Algoritma Greedy dan Breadth First Search pada Permainan Kartu Sevens

Pattern Matching dalam Aplikasi Pencarian Jodoh

Implementasi Struktur Data Rope menggunakan Binary Tree dan Aplikasinya dalam Pengolahan Teks Sangat Panjang

METODE POHON BINER HUFFMAN UNTUK KOMPRESI DATA STRING KARAKTER

Aplikasi Algoritma Brute Force Pada Knight s Tour Problem

Metode Path Finding pada Game 3D Menggunakan Algoritma A* dengan Navigation Mesh

Penggunaan Algoritma Pencocokkan Pola pada Aplikasi How-Old.net

Penerapan Algoritma Greedy dalam Pencarian Rantai Penjumlahan Terpendek

Pencarian Lintasan Terpendek Pada Aplikasi Navigasi Menggunakan Algoritma A*

Algoritma Divide and Conquer untuk Optimasi Pemberian Efek Aura pada Permainan DotA (Defense of the Ancient)

Aplikasi Algoritma Greedy untuk Menyelesaikan Permainan Hedgewars

Studi dan Analisis Skema Benaloh untuk Pembagian Rahasia dengan Verifikasi beserta Studi dan Implementasi Skema Ambang Shamir

Pencarian Solusi Permainan Pipe Puzzle Menggunakan Algoritma Backtrack

Pendeteksian Plagiarisme Musik dengan Algoritma Boyer- Moore

Penggunaan Algoritma Greedy untuk menyelesaikan Permainan Othello

Modifikasi Algoritma Caesar Cipher Menjadi SPICA-XB (Spinning Caesar dengan XOR Binary)

Aplikasi Algoritma Runut-balik untuk Penyelesaian Jenis Permainan Smart Mike pada Permainan Mike 2 in 1

PENERAPAN ALGORITMA BACKTRACKING PADA PERMAINAN WORD SEARCH PUZZLE

Transkripsi:

THE WAY OF LONGEST PALINDROME Listiarso Wastuargo 135 08 103 Program Studi Teknik Informatika Institut Teknologi Bandung Jl. Ganesha 10, Bandung e-mail: hallucinogenplus@gmail.com ABSTRAK Makalah ini membahas tentang palindrom. Lebih spesifiknya makalah ini melakukan pembahasan bagaimana cara menghitung palindrom terpanjang dalam sebuah string masukan. Makalah ini juga akan melakukan perbandingan antara algoritma-algoritma yang dapat digunakan untuk mencari palindrom terpanjang dalam sebuah string dan mencari yang terbaik diantara algoritma-algoritma yang diberikan. Kata kunci: palindrom, string matching, dynamic programming, string, branch and bound. I. PENDAHULUAN Dahulu manusia sulit berkomunikasi satu sama lain. Namun kini budaya dan bahasa sudah berkembang pesat. Manusia yang berbeda suku pun bisa berkomunikasi satu sama lain. Kebudayaan yang berkembang pesat ini melahirkan bahasa dan tulisan-tulisan yang menarik. Salah satu tulisan yang menarik adalah tulisan yang dibatasi. Tulisan yang dibatasi adalah tulisan yang memiliki batasanbatasan tertentu yang ditentukan oleh pembuat tulisan. Contoh batasan yang umum adalah membuat tulisan yang diakhiri atau diawali oleh huruf yang sama atau berbunyi bila dilafalkan sama. Masih mengenai tulisan yang dibatasi, ada satu batasan yang menarik yang dapat dikaji. Batasan tersebut adalah membuat sebuah tulisan yang dibaca sama persis dari kiri ke kanan maupun dari kanan ke kiri. Batasan tersebut disebut palindrom. Palindrom berasal dari bahasa Yunani palin yang berarti lagi dan dromos yang berarti jalan atau arah. Setelah melakukan pengamatan berulang-ulang kita pun mengetahui bahwa dalam sebuah kata atau kalimat kita dapat membentuk beberapa subkata atau subkalimat atau lebih general dengan nama substring. Substring ini mungkin saja adalah sebuah palindrom. Dan didalam palindrom itu sendiri, mungkin saja terdapat palindrompalindrom mini yang lain. Sehingga manusia yang selalu ingin tahu pasti mulai bertanya-tanya : Diberikan sekumpulan simbol (bisa berupa huruf, angka atau simbolsimbol lain) yang disusun menjadi sebuah string, tentukanlah palindrom terpanjang yang ada di dalam string tersebut II. Dasar Teori A. String dan Beberapa Terminologi String String Pada contoh pohon di atas, simpul 7 dan 5 adalah anak dari simpul 2, dan simpul 2 adalah orang tua dari simpul 7 dan 5. Substring Sebuah string A adalah substring dari string B bila apabila kita memotong string B (dari depan atau dari belakang), kita dapat membuat string A. Formalnya, sebuah substring dari sebuah string T = t 1..t n adalah sebuah string T s = t 1+i..t m+i dimana 0 i dan m + i < n Prefix Sebuah prefix dari sebuah string T = t 1..t n adalah sebuah string T s = t 1..t m dimana m n. Sebuah proper prefix dari sebuah string adalah sebuah prefix yang bukan merupakan string itu sendiri (memenuhi 0 m < n). Suffix Sebuah suffix dari sebuah string T = t 1..t n adalah sebuah string T s = t n-m+1..t n dimana m n. Sebuah proper suffix dari sebuah string adalah sebuah suffix yang bukan merupakan string itu sendiri (memenuhi 0 < m n). B. Palindrom Palindrom adalah sebuah kata, kalimat, frase, atau sekumpulan bilangan yang memiliki arti yang sama bila dibaca dari arah berbeda (dari kiri ke kanan atau dari kanan ke kiri).

III. Pencarian Palindrome Terpanjang Memastikan apakah sebuah string adalah palindrom adalah sebuah permasalahan yang tergolong kuno dan tidaklah menarik. Sedangkan mencari palindrom terpanjang pada sebuah string menjadi sebuah topik bahasan yang cukup menarik karena kita dapat mengkaji beberapa algoritma yang dapat menyelesaikannya. A. The Naive Way Cara paling naif adalah dengan memanfaatkan permasalahan yang ada sebelumnya : Bila diberikan sebuah string, tentukan apakah string tersebut palindrom atau tidak. Hal ini bisa kita lanjutkan menjadi sebuah algoritma : 1. Bentuklah seluruh substring yang mungkin dari string masukan. 2. Dari tiap-tiap substring, cek apakah substring tersebut palindrom atau tidak. 3. Bila substring tersebut palindrom, simpan substring tersebut dan bandingkan dengan substring palindrom terpanjang saat ini. 4. Bila substring yang baru saja didapatkan lebih panjang dari substring palindrom terpanjang saat ini, ubah substring palindrom terpanjang saat ini menjadi substring tersebut. Kodenya akan menjadi seperti berikut dalam C++ : string longestpalindromenaive(string inp){ string for (int i = strlen; i >= 1; --i){ for (int j = 0 ; j <= strlen - i; ++j){ for (int k = 0; k < i; ++k) pal += inp[j + k]; bool ispal = true; for (int k = 0 ; k < i / 2 && ispal; ++k) if (pal[k]!= pal[i - k - 1]) ispal = false; if (ispal) if (result.length() < i) result = pal; Bisa dilihat bahwa kompleksitas pembuatan seluruh substring adalah O(N 2 ) dan pengecekan kepalindroman sebuah substring adalah O(N) sehingga menghasilkan total kompleksitas O(N 3 ) untuk algoritma ini. Algoritma ini masih bisa diperbaiki lagi dengan melakukan penambahan strategi branch and bound. Strategi ini diterapkan dengan mengakhiri pencarian palindrom apabila sebuah palindrom telah ditemukan. Hal ini dikarenakan bila kita melakukan pengulangan dengan menguji substring terpanjang hingga substring terpendek, palindrom yang kita temukan pertama pasti merupakan substring palindrom terpanjang saat ini. Kodenya sedikit berubah menjadi : string longestpalindromebranchandbound(string inp){ for (int i = strlen; i >= 1; --i){ for (int j = 0 ; j <= strlen - i; ++j){ for (int k = 0; k < i; ++k) pal += inp[j + k]; bool ispal = true; for (int k = 0 ; k < i / 2 && ispal; ++k) if (pal[k]!= pal[i - k - 1]) ispal = false; if (ispal) return pal; return ""; B. The Middle Way Dengan mengamati lemma : Bila diberikan sebuah string A yang tidak palindrom dam 2 buah sembarang karakter b dan c, bac tidak mungkin palindrom. Dari lemma ini kitadapat mencari palindrom-palindrom yang ada didalam string masukan dengan lebih cepat, langkah langkahnya adalah : 1. Tentukan titik tengah palindrom (bisa berupa satu buah karakter atau buah karakter bila dua karakter yang bersebelahan tersebut sama). 2. Dari titik tersebut, catat karakter paling kiri dan karakter paling kanan sebagai titik tengah palindrom tersebut. 3. Apabila karakter paling kiri sama dengan karakter paling kanan, geser karakter paling kiri ke kiri dan karakter paling kanan ke kanan 4. Ulangi proses hingga karakter paling kiri tidak sama dengan paling karakter kanan atau karakter paling kiri telah mencapai karakter paling kiri string masukan atau karakter paling kanan telah mencapai karakter paling kanan string masukan. 5. Simpan substring ini, bandingkan dengan 6. Ulangi langkah 1-5 hingga seluruh titik tengah yang mungkin dalam string masukan telah dicoba. Pengamatan ini membuat kita tidak perlu melakukan pengecekan setiap substring. Dan kode kita menjadi :

string longestpalindrommiddle(string inp){ string for (int i = 0; i < strlen; ++i){ int j = 0; while (i - j >= 0 && i + j < strlen && inp[i - j] == inp[i + j]) ++j; if (2 * j - 1 > result.length()){ for (int k = i - j + 1; k < i + j; ++k) result += inp[k]; pal = ""; j = 0; while (i - j >= 0 && i + j + 1 < strlen && inp[i - j] == inp[i + j + 1]) ++j; if (2 * j > result.length()){ for (int k = i - j + 1; k <= i + j; ++k) result += inp[k]; Penentuan titik tengah memiliki kompleksitas O(N). Sedangkan pencarian palindrom terpanjang dari sebuah titik tengah memiliki kompleksitas terburuk O(N). Dengan menggabungkan keduanya, kita mendapatkan kompleksitas total dari algoritma ini adalah O(N 2 ). C. Algoritma yang Lebih Baik? Setelah mendapatkan fakta bahwa kita dapat menghitung palindrom terpanjang dengan kompleksitas tercepat O(N 2 ), pasti terbayang untuk menemukan algoritma yang lebih cepat. Kita mungkin saja mendapatkan komplekstias total O(N log N) atau bahkan O(N). Bila kita mendapatkan fakta bahwa ada algoritma dengan kompleksitas O(N) untuk permasalahan mencari palindrom terpanjang ini, kita tentunya akan berpikir bahwa algoritma O(N) ini akan dibentuk berdasarkan algoritma O(N 2 ) (the middle way) yang baru saja kita bahas. Sebagai percobaan pertama kita akan melakukan algoritma berikut : 1. Tentukan titik tengah palindrom. 2. Ekspansi ke kiri dan kenanan hingga kita 3. Simpan substring ini lalu bandingkan dengan 4. Ubah titik tengah menjadi karakter terakhir dari palindrom atau karakter terakhir dari palindrom ditambah satu karakter setelah palindrom bila dua karakter ini sama. Posisi titik tengah ini kedepannya akan kita sebut sebagai titik khusus. 5. Ulangi langkah 1 sampai 4 hingga titik tengah Bisa dilihat bahwa langkah 1 dan langkah 3 adalah langkah yang sama dengan langkah-langkah algoritma the middle way. Perbedaannya adalah kita tidak perlu mengecek semua titik tengah yang ada (seluruh karakter di string masukan tersebut), melainkan hanya di titik-titik khusus. Dan sesuai dengan keinginan kita, algoritma ini memiliki kompleksitas total O(N). Tapi ada satu hal yang perlu disayangkan. Algoritma ini menghasilkan keluaran yang salah. Sebagai contoh bila kita menjalankan algoritma ini untuk string abababa, algoritma kita akan mendeteksi palindrom abababa, abababa hingga akhirnya abababa padahal palindrom terpanjang yang bisa didapat adalah abababa! D. Pengamatan Properti Palindrom Kita bisa membenarkan kesalahan ini dengan mengubah cara kita memilih titik khusus. Dengan sedikit pengamatan kita bisa mengetahui bahwa titik khusus itu adalah titik tengah palindrom yang terkandung dalam palindrom yang sedang diperiksa saat ini. Lebih spesifik lagi, palindrom yang dimulai dari titik khusus pasti akan menjadi proper suffix dari palindrom yang sedang kita periksa. Masih belum cukup, titik tengah ini juga harus merupakan proper suffix terpanjang dan palindrom dalam palindrom yang sedang kita periksa. Sehingga algoritma kita akan berubah menjadi seperti berikut : 1. Tentukan titik tengah palindrom. 2. Ekspansi ke kiri dan kenanan hingga kita 3. Simpan substring ini lalu bandingkan dengan 4. Ubah titik tengah menjadi titik tengah proper suffix yang palindrom terpanjang dari palindrom yang sedang kita periksa. 5. Ulangi langkah 1 sampai 4 hingga titik tengah Untuk menemukan titik khusus ini sekarang tidak semudah dan seefisien algoritma semula. Bila kita ceroboh, mencari titik khusus ini bisa memakan waktu O(N), sedangkan proses pencarian palindrom masih O(N) sehingga kompleksitas kembali menjadi O(N 2 ) yang tidak sesuai dengan harapan. Disinilah saatnya kita memanfaatkan sifat-sifat palindrom dan dynamic programming. Pertama perlu diketahui bahwa proper suffix palindrom kita ini akan muncul paling tidak dua kali di palindrom yang sedang kita cek. Bahkan proper suffix ini adalah sekaligus proper prefix juga. Hal ini terjadi karena palindrom ini adalah palindrom!

E. The way of O(N) Setelah kita memahami sifat palindrom, maka kita bisa memanfaatkan sifat ini dan menggabungkannya dengan teknik pemrograman dinamis untuk menghasilkan algoritma yang efisien. Kita telah sampai pada tahap bahwa kita diharuskan mencari proper suffix atau proper prefix palindrom terpanjang dari palindrom yang sedang diperiksa. Hal ini sangat sulit dilakukan bila kita tidak memiliki sebuah tabel untuk menyimpan palindrom yang telah kita dapatkan saat ini. Tabel ini digunakan agar kita dapat mengiterasi tabel ini dan mungkin mendapatkan proper suffix atau proper prefix palindrom terpanjang dari palindrom yang sedang diperiksa. Dengan melakukan sedikit pengamatan hal ini berimplikasi bahwa kita hanya perlu menyimpan seluruh palindrom yang ada di string masukan dari awal hingga titik khusus sehingga kita pasti paling tidak akan mendapatkan proper prefix dari palindrom yang sedang diperiksa. Dengan kebutuhan untuk menyimpan seluruh palindrom yang telah kita temukan sampai suatu titik khusus kita masih tidak bergerak dari algoritma the middle way kita. Tapi sekarang kita berakhir pada pertanyaan yang berbeda. Diberikan titik khusus, palindrom terpanjang dari titik tersebut, tabel yang berisi palindrom hingga saat ini (hanya perlu menyimpan panjangnya saja); dapatkah kita menemukan titik khusus yang baru dan meneruskan isi tabel hingga titik khusus tersebut dengan efisien. Sebagai contoh bila kita memiliki sedang pada tahap : ababa??, tabelnya [0, 1, 0, 3, 0,?,?,?,?,?,?,?,?,?,?] ababa??, tabelnya [0, 1, 0, 3, 0, 5, 0,?,?,?,?,?,?,?,?] abababa, tabelnya [0, 1, 0, 3, 0, 5, 0, 7, 0, 5, 0, 3, 0, 1, 0] Hal terpenting yang perlu kita perhatikan adalah, tabel ini ternyata juga palindrom karena string masukannya sendiri juga palindrom. Bahkan tabel ini memiliki properti yang lebih general : palindrom terpanjang yang terletak sejauh D kekanan dari titik khusus akan paling tidak sepanjang palindrom terpanjang yang terletak sejauh D kekiri dari titik khusus bila palindrom D-kekiri secara sepenuhnya berada didalam palindrom yang sedang diperiksa dan sama panjangnya dengan palindrom D- kekanan tersebut bila palindrom D-kekiri tersebut bukanlah prefix dari palindrom yang sedang diperiksa atau palindrom yang sedang diperiksa adalah suffix dari string masukan. Hal ini berarti kita dapat mengisi palindrom kekanan dari suatu titik khusus bila kita mengetahui palindrom kekiri nya. Sebagai contoh bila kita memiliki tabel [0, 1, 0, 3, 0, 5,?,?,?,?,?,?,?,?,?], kita dapat secara intuitif menebak bahwa isi dari tabel selanjutnya adalah [0, 1, 0, 3, 0, 5, 0, 3?, 0, 1?, 0,?,?,?,?]. Hal ini juga membuat kita dapat memilih 3? sebagai titik tengah yang baru karena palindrom yang sedang diperiksa saat ini bukanlah suffix dari string masukan. Algoritma menghitung palindrom terpanjang kita berakhir menjadi : 1. Inisialisasi tabel untuk memuat semua titik tengah yang mungkin. 2. Pilih titik tengah pertama sebagai titik khusus. 3. Ekspansi ke kiri dan kenanan hingga kita 4. Masukkan panjang palindrom ini ke posisi tabel yang sesuai. 5. Iterasi kebelakang tabel dan isi palindrompalindrom yang merupakan suffix dari palindrom yang sedang diperiksa hingga suatu posisi. Ubah titik khusus ke posisi ini. 6. Ulangi langkah 1 sampai 5 hingga titik tengah 7. Cek kembali seluruh tabel dan dapatkan palindrom yang paling panjang. Kode kita akhirnya berakhir menjadi seperti ini : string longestpalindromelinear(string str){ int len = str.length(); vector<int> res; int i = 0; int pallen = 0; while (i < len){ if (i > pallen && str[i - pallen -1] == str[i]){ pallen += 2; i += 1; continue; res.push_back(pallen); int right = res.size() - 2; int left = right - pallen; bool found = false; for (int j = right; j > left; --j){ int now = j - left - 1; if (res[j] == now){ pallen = now; found = true; break; res.push_back(min(now, res[j])); if (!found){ ++i; pallen = 1; res.push_back(pallen); int right = res.size() - 2; int left = right - (2 * len + 1 - res.size()); for (int i = right; i > left; --i){ int now = i - left - 1; res.push_back(min(now, res[i]));

string for (int i = 2; i < res.size(); i += 2){ int tengah = i / 2; if (res[i] > result.length()){ int gerak = res[i] / 2; for (int j = tengah - gerak; j < tengah + gerak; ++j) result += str[j]; Bandung, 7 November 2010 Listiarso Wastuargo 13508103 if (i + 1 >= res.size()) break; if (res[i + 1] > result.length()){ int gerak = res[i + 1] / 2; for (int j = tengah - gerak; j <= tengah + gerak; ++j) result += str[j]; Algoritma ini hanya melakukan pengisian tabel, melakukan ekspansi palindrom dari titik khusus atau melakukan perpindahan titik khusus pada tiap iterasinya. Karena tabel yang perlu diisi memiliki ukuran dua kali panjang string masukan, algoritma ini berjalan pada kompleksitas linier alias O(N). IV. Kesimpulan Kompleksitas terbaik yang bisa didapatkan setelah melakukan beberapa pengamatan algoritma pencarian palindrom terpanjang hingga saat ini adalah O(N). Hal ini merupakan kemajuan yang cukup drastis mengingat kita memulai pengamatan kita dengan algoritma yang memiliki kompleksitas O(N 3 ). Dengan melakukan pengamatan berulang-ulang dan menggunakan strategi algoritma yang berbeda untuk menyerang suatu permasalahan, kita bisa mendapatkan solusi terbaik untuk suatu permasalahan. REFERENSI [1] http://en.wikipedia.org/wiki/substring 7 Desember 2010 pukul 13.19 [2] http://en.wikipedia.org/wiki/palindrome 7 Desember 2010 pukul 14.00 [3] http://www.akalin.cx/2007/11/28/finding-the-longestpalindromic-substring-in-linear-time/ 7 Desember 2010 pukul 16.20 PERNYATAAN Dengan ini saya menyatakan bahwa makalah yang saya tulis ini adalah tulisan saya sendiri, bukan saduran, atau terjemahan dari makalah orang lain, dan bukan plagiasi.