При « памяти в качестве ограничения » я бы даже не стал использовать HashSet (который afaik также удалит дублирующиеся строки в исходном списке), потому что вы будете использоватьдополнительная структура HashSet, которая занимает немного памяти.
Сортировка, также не улучшит использование памяти.
Я бы использовал исходный список (который уже есть, поэтому дополнительная память не будетиспользоваться) + 3-байтовая целочисленная переменная для итерации списка.3 байта могут перебирать список из 2 ^ 24 = 16777216 строк
С « памятью в качестве ограничения » я бы пошел на 2 для циклов.Я думаю, что C-подобный псевдокод будет легче понять, чем мой обычный английский.
Примечания:
- Из примера, представленного в вопросе, на самом деле это не Список, аМассив, поэтому я буду работать со структурой, как если бы это был Массив
- Вопрос не ясен, как соединить эти "abc", "def", "cba", "abc".Я буду соединять первый "abc" с "cba", а также этот "cba" со "вторым" abc "(намерение неясно в вопросе)
- Я предполагаю, что мы не можем изменить оригиналlist
Вот код наименьшего потребления памяти, который я могу себе представить:
// "list" holds the original list (array)
for (int i = 0; i < length(list) - 1; i++) {
for (int j = i + 1; j < length(list); j++) {
if (list[i] == reverse(list[j])) {
print(list[i] + " reversed is " list[j])
}
}
}
Что касается использования памяти, это решение будет принимать 2 целочисленные переменные (обычно 4 байта каждая) +исходный список, от которого, как я полагаю, мы не можем избавиться.
Что касается использования ЦП (на самом деле, не имеет значения в зависимости от вопроса), то количество раз, когда строки будут обращены, будет: (N * (N + 1)) / 2 где N - длина списка