mis. "ccddcc" dalam string "abaccddccefe"
Saya memikirkan solusi tetapi itu berjalan dalam waktu O (n ^ 2)
Algo 1:
Langkah-langkah: Ini adalah metode kekerasan
- Memiliki 2 untuk loop
untuk i = 1 hingga i kurang dari array.length -1
untuk j = i + 1 hingga j kurang dari array.length - Dengan cara ini Anda bisa mendapatkan substring dari setiap kemungkinan kombinasi dari larik
- Memiliki fungsi palindrome yang memeriksa apakah suatu string adalah palindrome
- jadi untuk setiap substring (i, j) panggil fungsi ini, jika itu adalah palindrome simpan dalam variabel string
- Jika Anda menemukan substring palindrome berikutnya dan jika lebih besar dari yang sekarang, gantilah dengan yang sekarang.
- Akhirnya variabel string Anda akan memiliki jawabannya
Masalah: 1. Algo ini berjalan dalam waktu O (n ^ 2).
Algo 2:
- Balikkan string dan simpan dalam array yang berbeda
- Sekarang temukan substring terbesar yang cocok di antara kedua larik
- Tapi ini juga berjalan dalam waktu O (n ^ 2)
Bisakah kalian memikirkan algo yang berjalan di waktu yang lebih baik. Jika memungkinkan O (n) waktu
algorithm
palindrome
Pelajar
sumber
sumber
O(n^2)
mendapatkan substring *O(n)
untuk memeriksa apakah mereka palindrom, dengan totalO(n^3)
?Jawaban:
Anda dapat menemukan palindrom terpanjang menggunakan Algoritma Manacher ini di
O(n)
waktu! Penerapannya dapat ditemukan di sini dan di sini .Untuk masukan
String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"
ia menemukan keluaran yang benar yaitu1234567887654321
.sumber
while
tertanam difor
dengan pembatas yang tampaknya mirip dengan lingkaran luar.Algo 2 mungkin tidak berfungsi untuk semua string. Berikut adalah contoh string seperti "ABCDEFCBA".
Bukan berarti string tersebut memiliki "ABC" dan "CBA" sebagai substringnya. Jika Anda membalikkan string asli, itu akan menjadi "ABCFEDCBA". dan substring terpanjang yang cocok adalah "ABC" yang bukan palindrome.
Anda mungkin perlu juga memeriksa apakah substring terpanjang yang cocok ini sebenarnya adalah palindrome yang memiliki waktu berjalan O (n ^ 3).
sumber
Sejauh yang saya mengerti masalahnya, kita dapat menemukan palindrom di sekitar indeks tengah dan menjangkau pencarian kita dua arah, ke kanan dan kiri tengah. Mengingat itu dan mengetahui tidak ada palindrom di sudut masukan, kita dapat mengatur batas ke 1 dan panjang-1. Sambil memperhatikan batas minimum dan maksimum String, kami memverifikasi apakah karakter pada posisi indeks simetris (kanan dan kiri) sama untuk setiap posisi tengah hingga kami mencapai pusat batas atas maksimal kami.
Loop luar adalah O (n) (maks n-2 iterasi), dan loop dalam sementara adalah O (n) (max sekitar (n / 2) - 1 iterasi)
Berikut implementasi Java saya menggunakan contoh yang diberikan oleh pengguna lain.
Output dari ini adalah sebagai berikut:
sumber
expandAroundCenter
.dengan regex dan ruby Anda dapat memindai palindrom pendek seperti ini:
sumber
Saya telah menulis program Java berikut karena penasaran, HTH yang sederhana dan cukup jelas. Terima kasih.
sumber
Saya ditanyai pertanyaan ini baru-baru ini. Inilah solusi yang [akhirnya] saya dapatkan. Saya melakukannya dalam JavaScript karena cukup mudah dalam bahasa itu.
Konsep dasarnya adalah Anda berjalan di string mencari palindrom multi-karakter sekecil mungkin (baik dua atau tiga karakter satu). Setelah Anda memilikinya, perluas perbatasan di kedua sisi sampai berhenti menjadi palindrom. Jika panjang itu lebih panjang dari yang terpanjang saat ini, simpan dan lanjutkan.
Ini pasti bisa dibersihkan dan dioptimalkan sedikit lebih banyak, tetapi harus memiliki kinerja yang cukup baik di semua skenario kecuali kasus terburuk (serangkaian huruf yang sama).
sumber
i
j
l
s
if
dan pemeliharaan status. multi poin pengembalian, kasus tepi ...Hai, Ini kode saya untuk menemukan palindrome terpanjang dalam string. Silakan merujuk ke tautan berikut untuk memahami algoritme http://stevekrenzel.com/articles/longest-palnidrome
Data uji yang digunakan adalah HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
sumber
Lihat artikel Wikipedia tentang topik ini. Contoh implementasi Algoritma Java Manacher untuk solusi linier O (n) dari artikel di bawah ini:
sumber
Regexp
Solusi efisien yang menghindari kekerasanDimulai dengan seluruh panjang string dan bekerja ke bawah hingga 2 karakter, ada segera setelah kecocokan dibuat
Untuk
"abaccddccefe"
regexp menguji 7 pertandingan sebelum kembaliccddcc
.vbs
vba
fungsi
sumber
sumber
Coba string - "HYTBCABADEFGHABCDEDCBAGHTFYW123456789987654321ZWETYGDE"; Ini harus bekerja untuk teman genap dan ganjil. Terima kasih banyak untuk Mohit!
menggunakan namespace std;
sumber
isPal
- operasi O (n) - hanya untuk mengukur panjangnya !? Juga memiliki upaya buggy dalam menangani bahkan palindrome. Pada bugginess palindrom genap:else if(input_str[i] == input_str[j])
tidak akan pernah berhasil karena pengujian yang sama pasti gagal dalamif
pernyataan sebelumnya ; dan bagaimanapun juga itu buggy karena Anda tidak dapat membedakan hanya dengan melihat 2 karakter yang berjarak 2 posisi terpisah apakah Anda sedang melihat palindrom genap atau yang ganjil (pertimbangkanAAA
danAAAA
).Kode berikut menghitung Palidrom untuk string dengan panjang genap dan panjang ganjil.
Bukan solusi terbaik tetapi berfungsi untuk kedua kasus
HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE
sumber
Kita dapat menemukan semua palindrom dengan panjang semua menggunakan ini.
Sampel :
kata = abcdcbc
modifiedString = a # b # c # d # c # b # c
palinCount = 1010105010301
panjang palindrom terpanjang = 5;
palindrom terpanjang = bcdcb
kelas publik MyLongestPalindrome {
}
sumber
Ini akan mengembalikan string palindrom terpanjang dari string yang diberikan
== OUTPUT ===
Masukan: abcccde Keluaran: ccc
Masukan: abcccbd Keluaran: bcccb
Masukan: abedccde Keluaran: edccde
Masukan: abcccdeed Output: akta
Masukan: abcccbadeed Keluaran: abcccba
sumber
Berikut implementasinya dalam javascript:
sumber
Untuk solusi linier, Anda dapat menggunakan algoritma Manacher. Ada algoritma lain yang disebut Algoritma Gusfield, dan di bawah ini adalah kode di java:
Anda dapat menemukan lebih banyak tentang solusi lain seperti solusi O (n ^ 2) terbaik atau algoritma Manacher dari blog saya sendiri .
sumber
Di sini saya telah menulis logika mencobanya :)
sumber
Solusi ini memiliki kompleksitas O (n ^ 2). O (1) adalah kompleksitas ruang.
sumber
{'DED': 3, '123456789987654321': 18, '67899876': 8, 'ABCDEDCBA': 9, '456789987654': 12, '34567899876543': 14, 'BCDEDCB': 7, 'ABA': 3, ' 5678998765 ': 10,' 2345678998765432 ': 16,' CDEDC ': 5,' 789987 ': 6,' 8998 ': 4} (' 123456789987654321 ', 18)
sumber
Inilah algoritma saya:
1) atur pusat saat ini menjadi huruf pertama
2) secara bersamaan berkembang ke kiri dan kanan sampai Anda menemukan palindrom maksimum di sekitar pusat saat ini
3) jika palindrome yang Anda temukan lebih besar dari palindrome sebelumnya, perbarui
4) atur pusat saat ini menjadi huruf berikutnya
5) ulangi langkah 2) sampai 4) untuk semua huruf dalam string
Ini berjalan di O (n).
Semoga membantu.
sumber
Referensi: Wikipedia.com
Algoritme terbaik yang pernah saya temukan, dengan kompleksitas O (N)
sumber
solusi saya adalah:
sumber
Substring()
dan string-equality (==
). Ini pada dasarnya identik dengan OP's algo # 1.