Edit: cho câu hỏi làm rõ:
- Sắp xếp các dây
- Tìm tiền tố chung dài nhất của mỗi cặp liền kề
- Sắp xếp và dedupe các tiền tố thông thường, sau đó loại bỏ bất kỳ đó là một tiền tố khắt khe của khác.
Thực tế, bước (3) chỉ yêu cầu bạn xóa bất kỳ khoản tiền nào là tiền tố/tiền tố của tài khoản khác, mà bạn có thể thực hiện bằng trie hoặc bất kỳ thứ gì thay vì sắp xếp. Trong thực tế, có thể toàn bộ điều có thể được thực hiện nhanh hơn với một trie được chú thích phù hợp - nếu bạn bao gồm "đếm" tại mỗi nút thì bạn đang tìm kiếm chính xác các nút có số lượng 2+, không có con đếm 2+.
Nhưng sắp xếp được tích hợp và khi bạn đã sắp xếp, bạn có thể phát hiện tiền tố bằng cách xem các mục lân cận, vì vậy có thể ít nỗ lực hơn.
[Câu trả lời gốc:
Chỉ một thao tác một lần, tìm tiền tố chung dài nhất giữa tất cả các chuỗi?
Tôi có thể làm điều đó theo độ dài của tiền tố. Trong pseudo-code, và giả sử chuỗi nul-chấm dứt:
prefixlen = strlen(first_string);
foreach string in the list {
for (i = 0; i < prefixlen; ++i) {
if (string[i] != first_string[i]) {
prefixlen = i;
break;
}
}
if (prefixlen == 0) break;
}
common_prefix = substring(firststring, 0, prefixlen);
]
Nguồn
2011-07-09 12:06:13
Vì vậy, bạn muốn tất cả các chuỗi 's' sao cho' s' là tiền tố chung của hai chuỗi trong danh sách và 's' không phải là chuỗi con nghiêm ngặt của bất kỳ tiền tố chung nào khác của cùng hai chuỗi và 's' không phải là chuỗi rỗng? Còn về '{" a1 "," a2 "," ab1 "," ab2 "}', bạn có muốn '" a "' hay không? –
Vâng, đúng vậy. Và không, tôi không cần. – cfischer