Đây là một cuộc phỏng vấn question: Tìm tất cả (từ tiếng Anh) chất nền của một chuỗi nhất định. (every = every, ever, very).Tìm tất cả (từ tiếng Anh) chất nền của một chuỗi đã cho
Rõ ràng, chúng ta có thể lặp qua tất cả các chất nền và kiểm tra từng chất chống lại một từ điển tiếng Anh, được tổ chức như một bộ. Tôi tin rằng từ điển đủ nhỏ để phù hợp với RAM. Cách sắp xếp từ điển? Đối với như tôi nhớ, lệnh spell
gốc đã tải tệp words
trong một bitmap
, đại diện cho một tập hợp các giá trị băm từ. Tôi sẽ bắt đầu từ đó.
Một giải pháp khác là một trie
được tạo từ từ điển. Sử dụng trie chúng ta có thể lặp qua tất cả các ký tự chuỗi và kiểm tra trie
cho mỗi ký tự. Tôi đoán sự phức tạp của giải pháp này sẽ giống nhau trong trường hợp xấu nhất (O(n^2)
)
Có hợp lý không? Bạn có đề xuất các giải pháp khác không?
Độ phức tạp của vòng lặp trên tất cả các bệ kiểm tra băm phụ thuộc vào tính toán băm của bạn - có theta (n^2) đế có chiều dài trung bình không O (1), vì vậy bạn cần tính băm một phần mà bạn có thể tăng thêm một ký tự tại một thời điểm để giữ O (n^2) tổng thể. Điều tương tự cũng đúng với tra cứu Trie hoặc DAWG, tất nhiên, bạn muốn giảm dần việc kiểm tra tất cả các chuỗi bắt đầu từ một điểm nhất định, nhưng rõ ràng là nó là điều đúng đắn để làm. –
Đi bộ trie, bắt đầu từ mọi nhân vật có thể bắt đầu và xuất ra tất cả các từ ngữ pháp lý khi bạn thấy chúng có vẻ hiệu quả; bạn ngừng tìm kiếm ngay sau khi bạn tìm thấy một chuỗi ký tự không thể là tiền tố của một từ và bạn không thể làm tốt hơn O (n^2) - có thể mọi chuỗi con đều hợp lệ và có O (n^2) trong số đó. –