Làm cách nào để tìm tất cả các hoán vị của chuỗi trong JavaScript?

Dưới đây là các hoán vị của xâu ABC.
ABC ACB BAC BCA CBA CAB

Điều này có thể được giải quyết bằng thuật toán đệ quy và câu hỏi được hỏi nhiều nhất trong các cuộc phỏng vấn,


function permute[str, l, r] {
    if [l == r]
        console.log[str];
    else {

        for [let i = l; i  -1
      A.1 push b.substring[i, a.length] to result
4 return result

Triển khai JavaScript

Độ phức tạp về thời gian của một giải pháp ngây thơ để tạo ra tất cả các hoán vị của một chuỗi ít nhất sẽ là cấp số nhân, cụ thể là O[n. ], trong đó n là độ dài của chuỗi. Điều này là do có n. [n giai thừa] các hoán vị có thể có của một chuỗi có n ký tự. Ví dụ: chuỗi có 4 ký tự thì có 4. = 24 hoán vị và một chuỗi có 5 ký tự có 5. = 120 hoán vị

[
    'abcd', 'abdc', 'acbd',
    'acdb', 'adbc', 'adcb',
    'bacd', 'badc', 'bcad',
    'bcda', 'bdac', 'bdca',
    'cabd', 'cadb', 'cbad',
    'cbda', 'cdab', 'cdba',
    'dabc', 'dacb', 'dbac',
    'dbca', 'dcab', 'dcba'
  ]

Độ phức tạp lần này không hiệu quả lắm, đặc biệt đối với các chuỗi lớn hơn, vì số lượng hoán vị tăng rất nhanh với kích thước của chuỗi. Có nhiều thuật toán hiệu quả hơn để tạo các hoán vị có độ phức tạp thời gian thấp hơn, chẳng hạn như thuật toán Heap, có độ phức tạp thời gian là O[n * n. ], hoặc thuật toán Steinhaus–Johnson–Trotter, có độ phức tạp thời gian là O[n * n]. Các thuật toán này có thể phù hợp hơn để tạo hoán vị của các chuỗi lớn hơn

Hãy thử chạy triển khai JS này khi một. chiều dài >= 10 và có thể bạn sẽ gặp lỗi hết thời gian chờ

thuật toán tối ưu hóa

Để tối ưu hóa thuật toán của chúng tôi, chúng tôi có thể thực hiện một cái gì đó tương tự như thuật toán Rabin-Karp. Cũng giống như nhiều thuật toán thời gian chạy hàm mũ, chẳng hạn như thuật toán dãy Fibonacci nổi tiếng, chúng ta có thể cải thiện thuật toán này bằng cách triển khai bảng băm

nền toán học

Gọi S = {A_1, …, A_n} là một danh sách nhiều tập hợp có kích thước N chỉ chứa các số nguyên tố. Gọi tổng các số trong S bằng một số nguyên Q. Khi đó S là tập hợp nhiều nguyên tố hoàn toàn duy nhất có thể có kích thước N, các phần tử của chúng có thể tổng bằng Q

Ephraim Rothschild

Điều này cho phép chúng ta gán mỗi ký tự cho một số nguyên tố, trong đó số nguyên tố là khóa băm, tổng của tất cả các hoán vị của các khóa ký tự chuỗi ngắn hơn là bằng nhau. Bây giờ, điều duy nhất còn lại là kiểm tra xem tổng các chuỗi con trên chuỗi dài hơn có bằng tổng của chuỗi sắp xếp không

Triển khai mã giả

procedure getAllPermutations[a, b]
1. result = []
2. smallHash = primes[a[0]] + primes[a[1]] .. + primes[a[a.length]]
3. left = 0, right = shorter.length
4. currentHash = primes[a[0]] + primes[a[1]] .. + primes[a[a.length]]
5. while right 

Chủ Đề