Nếu bạn tạo ma trận 26X26 để biểu thị đồ thị có hướng của đỉnh như mỗi bảng chữ cái và các từ làm cạnh. Ví dụ từ - APPLE kết nối đỉnh A và E với cạnh được hướng từ A đến E. Bây giờ, vấn đề giảm xuống để tìm đường Euler lớn nhất (đường dẫn bao gồm số cạnh tối đa, truy cập mỗi cạnh một lần có thể lặp lại các đỉnh) trong biểu đồ. Một trong những thuật toán O (E) sẽ là bắt đầu ngẫu nhiên từ một cặp đỉnh. Tìm một con đường giữa chúng. Hơn tiếp tục thư giãn con đường cho đến khi nó có thể.
update
@ GlenH7 Tôi đã giải quyết một câu hỏi tương tự trên www.hackerearth / jda gần đây, có những điểm tương đối liên quan đến giải pháp tốt nhất và tôi đã đạt điểm cao nhất với sự chấp thuận sau đây-
Đưa ra danh sách các từ. Tìm chuỗi dài nhất có thể được hình thành bởi chúng. Chuỗi có giá trị nếu mỗi từ bắt đầu bằng một chữ cái * kết thúc ở cuối từ cuối cùng.
Ứng dụng =
1) tạo đồ thị của bảng chữ cái dưới dạng các đỉnh và các từ làm các cạnh. Thay vì sử dụng nhiều cạnh, hãy sử dụng một cạnh có trọng số bằng số cạnh.
2) tìm thành phần kết nối mạnh của đồ thị với các cạnh tối đa. Tạm thời loại bỏ các cạnh khác.
3) Với mỗi đỉnh làm cho độ chính xác của nó bằng với độ lệch của nó.
4) Bây giờ mạch eulerian tồn tại của họ trong đồ thị. Tìm nó.
5) Bây giờ trong biểu đồ còn lại (biểu đồ wrt orignal tìm đường dài nhất với đỉnh đầu tiên trong thành phần được kết nối mạnh được chọn. Tôi nghĩ rằng đây là NP cứng.
6) Bao gồm đường mòn trên trong mạch Elerian chuyển đổi mạch điện tử thành đường mòn.
Tại sao - Tôi chấp nhận rằng câu hỏi này rất có thể là NP khó (đoán, không nói theo toán học). Nhưng cách tiếp cận trên hoạt động tốt nhất khi có một danh sách dài (1000+) từ được phân phối đồng đều (nghĩa là không có ý định trở thành wc cho cách tiếp cận trên). Chúng ta hãy giả sử rằng sau khi chuyển đổi danh sách đã cho thành biểu đồ được đề cập ở trên, may mắn thay, đó là một biểu đồ eulerian (xem http://en.wikipedia.org/wiki/Eulerian_path để biết điều kiện), sau đó không nghi ngờ gì chúng ta có thể nói câu trả lời đó với câu hỏi trên là P và thực sự là đường dẫn eulerian trong biểu đồ (xem http://www.graph-magics.com/articles/euler.php để biết cách đơn giản để làm như vậy và xem điều này để xác minh rằng biểu đồ của bạn có đơn http://www.geekforgeek.org/strongly-connected-components/và nếu không tạm thời làm sạch scc nhỏ khác vì đường dẫn euler tồn tại cho scc đơn). Vì vậy, đối với các trường hợp không may mắn (gần như tất cả các trường hợp) tôi cố gắng chuyển đổi chúng thành các trường hợp may mắn (tức là điều kiện đường mòn eulerian được đáp ứng). làm như thế nào? Tôi đã cố gắng tăng cường tìm kiếm độ sâu cho các cạnh không liên quan (tập hợp các cạnh trong một đường dẫn nhìn từ đỉnh có độ lệch lớn hơn độ lớn và kết thúc ở đỉnh có độ lớn hơn độ lệch). Tăng tìm kiếm theo chiều sâu có nghĩa là trước tiên tôi đã tìm kiếm tất cả các cạnh của một cạnh trong đường dẫn hơn hai cạnh trong đường dẫn, v.v. Thoạt nhìn có vẻ như tìm kiếm theo chiều sâu sẽ mất O (các nút ^ i) do đó tổng độ phức tạp thời gian của O (các nút + nút ^ 2 + nút ^ 3 + ....) cho đến khi đó là một trường hợp may mắn. Nhưng phân tích khấu hao sẽ tiết lộ nó là O (các cạnh). Một khi nó được giảm trường hợp may mắn tìm mạch eulerian.
Cho đến đây là tất cả thời gian đa thức. Điều này sẽ cung cấp gần như giải pháp tốt nhất. Nhưng để tăng thêm giải pháp của bạn (giải pháp hoàn hảo là NP khó) hãy thử một số cách tiếp cận tham lam trong biểu đồ còn lại để tìm một vệt dài nhìn chằm chằm với một trong các đỉnh trong scc đã chọn. Bây giờ thêm điều này vào đường mòn eulerian tìm thấy ở trên để tăng thêm nó.