(Tôi viết những dòng này trong bối cảnh JavaScript, nhưng sẽ chấp nhận một câu trả lời đúng thuật toán bằng ngôn ngữ nào)Tìm các xâu độc đáo nhỏ nhất cho mỗi chuỗi trong một mảng
Làm thế nào để bạn tìm thấy chuỗi con ngắn nhất của mỗi phần tử trong một chuỗi các chuỗi trong đó chuỗi con KHÔNG được chứa trong bất kỳ phần tử nào khác, bỏ qua trường hợp?
Giả sử tôi có một mảng đầu vào như:
var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];
Đầu ra phải được cái gì đó như:
var uniqueNames = ["ne", "h", "ua", "ka", "i", "r"];
Đối với mục đích của tôi, bạn có thể giả định rằng không có yếu tố sẽ được chứa hoàn toàn trong vòng một yếu tố khác.
Suy nghĩ của tôi:
Dường như người ta có thể có sức mạnh vũ phu này, dọc theo dòng:
var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];
var uniqueNames = [], nameInd, windowSize, substrInd, substr, otherNameInd, foundMatch;
// For each name
for (nameInd = 0; nameInd < names.length; nameInd++)
{
var name = names[nameInd];
// For each possible substring length
windowLoop:
for (windowSize = 1; windowSize <= name.length; windowSize++)
{
// For each starting index of a substring
for (substrInd = 0; substrInd <= name.length-windowSize; substrInd++)
{
substr = name.substring(substrInd,substrInd+windowSize).toLowerCase();
foundMatch = false;
// For each other name
for (otherNameInd = 0; otherNameInd < names.length; otherNameInd++)
{
if (nameInd != otherNameInd && names[otherNameInd].toLowerCase().indexOf(substr) > -1)
{
foundMatch = true;
break;
}
}
if (!foundMatch)
{
// This substr works!
uniqueNames[nameInd] = substr;
break windowLoop;
}
}
}
}
Nhưng tôi có thể tưởng tượng có một giải pháp thanh lịch hơn khi sử dụng cố gắng/cây tiền tố, mảng hậu tố, hoặc một cái gì đó thú vị như thế.
Edit: Tôi tin rằng đây là hình thức câu trả lời được lựa chọn sẽ mất lập trình trong JavaScript:
var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];
var uniqueNames = [], permutations = {}, permutation, nameInd, windowSize, substrInd, substr;
// For each name
for (nameInd = 0; nameInd < names.length; nameInd++)
{
var name = names[nameInd];
// For each possible substring length
windowLoop:
for (windowSize = 1; windowSize <= name.length; windowSize++)
{
// For each starting index of a substring
for (substrInd = 0; substrInd <= name.length-windowSize; substrInd++)
{
substr = name.substring(substrInd,substrInd+windowSize).toLowerCase();
permutations[substr] = (typeof permutations[substr] === "undefined")?nameInd:-1;
}
}
}
for (substr in permutations)
{
permutation = permutations[substr];
if (permutation !== -1 && ((typeof uniqueNames[permutation] === "string" && substr.length < uniqueNames[permutation].length) || typeof uniqueNames[permutation] === "undefined"))
{
uniqueNames[permutation] = substr;
}
}
Sản lượng mẫu của bạn có chính xác không? Tôi không thấy 's' và' y' ở đó trong khi nhìn thấy 'i, h' và' r' ... – Icarus
@Icarus Ah, điểm tốt. 's' và' y' không chỉ hiện diện bởi vì tôi không tìm kiếm tất cả các chất nền nhỏ nhất phù hợp với tiêu chí, thay vì bất kỳ một cái nào là đủ tốt. Tôi sẽ chấp nhận một câu trả lời trả về một mảng hai chiều của tất cả chúng, nhưng tôi không thực sự cần mức độ chi tiết đó. Sản lượng hợp lệ như nhau có thể là 'var uniqueNames = [" ne "," y "," ua "," ka "," i "," s "];' – Patrick
Có thể giới hạn bảng chữ cái đầu vào của bạn đến 26 ký tự (hoặc một cái gì đó như thế này, chỉ giới hạn nó)? –