Diberikan dua string bagaimana Anda bisa memeriksa apakah mereka permutasi satu sama lain menggunakan ruang O (1)? Memodifikasi string tidak diizinkan dengan cara apa pun.
Catatan: O (1) spasi dalam kaitannya dengan panjang string DAN ukuran alfabet.
algorithms
strings
space-complexity
Anonim
sumber
sumber
O(log n)
untuk string dengan panjang n yang tidak konstan dengan panjang atau ukuran alfabet. Ketika string dapat dimodifikasi sementara, saya pikir ada solusi dengan peningkatan alfabet yang linier dalam ukuran alfabet tetapi konstan dalam panjang string dalam model logaritmik.Jawaban:
Pendekatan naif akan membangun histogram dari kedua string dan memeriksa apakah mereka sama. Karena kami tidak diperbolehkan menyimpan struktur data seperti itu (yang ukurannya akan linier dengan ukuran alfabet) yang dapat dihitung dalam satu lintasan, kami perlu menghitung kemunculan setiap simbol yang mungkin setelah yang lainnya:
Ini tentu saja mengasumsikan bahwa jumlah dan indeks iterator adalah bilangan bulat dari ukuran konstan, bukannya tergantung pada panjang string.
sumber
O(n * min(n, |Σ|))
. Hm, sekarang saya memikirkannya, itu terdengar seperti solusi "diizinkan untuk mengulangi" dari jawaban Anda, bukan?count
tidakO(1)
(yaitu mungkin meluap)count
adalahint
:-) Ya, itu tidak akan bekerja, tetapi di Jawa yang tidak dapat terjadi pulaNyatakan array oleh , dan anggap panjangnya n .A,B n
Anggaplah pertama bahwa nilai-nilai dalam setiap array berbeda. Berikut ini adalah algoritma yang digunakan :O(1)
Hitung nilai minimum kedua array, dan periksa apakah keduanya sama.
Hitung nilai minimum kedua dari kedua array, dan periksa apakah keduanya sama.
Dan seterusnya.
Menghitung nilai minimum array jelas menggunakan ruang . Dengan elemen terkecil ke k , kita dapat menemukan ( k + 1O(1) k dengan menemukan nilai minimal lebih besar darielemen terkecil ke- k (di sini kita menggunakan fakta bahwa semua elemen berbeda).(k+1) k
Saat elemen diizinkan untuk diulang, kami memodifikasi algoritme sebagai berikut:
Hitung nilai minimum dari kedua array, hitung berapa kali masing-masing muncul, dan verifikasi m A , 1 = m BmA,1,mB,1 dan hitungnya sama.mA,1=mB,1
Hitung nilai minimum lebih besar dari m A , 1 , m B , 1 dalam dua array (masing-masing), dan hitung berapa kali masing-masing muncul. Verifikasi bahwa m A , 2 = m B ,mA,2,mB,2 mA,1,mB,1 , dan bahwa penghitungannya identik.mA,2=mB,2
Dan seterusnya.
sumber
Tentukan beberapa fungsi f (c) yang memetakan beberapa karakter c ke bilangan prima unik (a = 2, b = 3, c = 5, dll).
Hanya menyatakan bahwa Anda dapat menggunakan fungsi pemetaan bilangan prima agak mudah, dan kemungkinan besar di mana masalah akan muncul menjaga ruang.O(1)
sumber
Anda bisa melakukan iniO(nlogn)
. Sortir kedua string, dan bandingkan indeksnya dengan indeks. Jika mereka berbeda di mana saja, mereka tidak permutasi satu sama lain.Untuk
O(n)
solusi, hashing dapat digunakan. Fungsi hashing ini akan bekerja, dane
untuk huruf apa pun akan menjadi nilai ascii-nya. Jika dua hash string berbeda, mereka tidak permutasi satu sama lain.Fungsi hashing dalam tautan:
Menggunakan hashing ganda (atau untuk lebih banyak lagi) dengan mengubah nilai R akan berhasil mengidentifikasi mereka sebagai permutasi dengan probabilitas yang sangat tinggi .
sumber
Katakanlah Anda memiliki dua string yang disebut s dan t.
Anda dapat menggunakan heuristik untuk memastikan bahwa mereka tidak sama.
Setelah ini, Anda dapat dengan mudah menjalankan algoritma untuk membuktikan bahwa stringnya sama.
Tentu saja Anda tidak dapat mengurutkan secepat itu jika Anda tidak diizinkan untuk menggunakan ruang tambahan. Jadi tidak masalah algoritma mana yang Anda pilih - setiap algoritma akan membutuhkan akan berjalan dalam waktu O (n ^ 2) ketika hanya ada O (1) ruang dan jika heuristik tidak dapat membuktikan bahwa mereka tidak bisa sama.
sumber
Dalam kode C-style untuk seluruh rutin:
Atau dalam kode pseudo yang sangat verbose (menggunakan pengindeksan berbasis 1)
di mana fungsi checkLetters (A, B, i) memeriksa bahwa jika ada salinan M dari A [i] di A [1] .. A [i], maka setidaknya ada M salinan A [i] di B:
dan fungsi findNextValue mencari dalam B untuk nilai yang dimulai dari indeks, dan mengembalikan indeks yang ditemukannya (atau n +1 jika tidak ditemukan).
sumber
Loop through
string1
danstring2
, untuk setiap karakter, periksa seberapa sering dapat ditemukan distring1
danstring2
. Saya seorang karakter lebih sering dalam satu string daripada yang lain, itu bukan permutasi. Jika frekuensi semua karakter sama maka string adalah permutasi satu sama lain.Berikut adalah sepotong python untuk membuat ini tepat
string
string1
string2
char
char1
char2
count1
count2
string
[string1, string2]
.Tentu saja Anda bahkan tidak perlu variabel jumlah tetapi dapat menggunakan pointer.
sumber