Алгоритм усечения строки и устранения дубликатов (без учета регистра)

1

У меня есть набор строк, которые удовлетворяют следующим ограничениям

  • Деликатный случай
  • Максимальная длина символа 10

Я хочу преобразовать эти строки так, чтобы выполнялись новые ограничения (вместо предыдущих ограничений)

  • Без учета регистра
  • Максимальная длина символа 5

Предположим, что начальный набор строк выглядит следующим образом

city, City, cIty, ciTy, citY, CIty, cITy, ciTY, CITy, cITY, CITY

У меня есть частичный алгоритм, который отображает эти строки на следующие

cit, cit1, cit2, cit3, cit4, cit5, cit6, cit7, cit8, cit9, cit10

Это делается с использованием следующей логики

  • Рассмотрим первую строку как общий префикс
  • Подсчитайте количество совпадений в остальных строках (нечувствительность к регистру). В текущем случае это 10
  • Определите количество символов, необходимых для суффикса. В текущем случае, поскольку мне нужно сгенерировать достаточное количество от 1 до 10, мне нужно зарезервировать 2 символа для суффикса
  • Усечь общий префикс (Макс. Символы - количество символов для суффикса). В текущем случае это (5 - 2), т.е. 3 символа
  • Сгенерировать строки путем конкатенации усеченного общего префикса и суффикса

Используя вышеизложенное, я могу сопоставить старый набор строк с новым набором и удовлетворить новые ограничения.

Однако мой алгоритм ломается, если в исходном наборе есть строка, которая генерируется алгоритмом

Предположим, что начальное множество строк было

city, cit1, cit2, City, cIty, ciTy, citY, CIty, cITy, ciTY, CITy, cITY, CITY, 

В этом случае, поскольку cit1 и cit2 уже существуют в исходном наборе, алгоритм прерывается (поскольку он генерирует дубликаты cit1 и cit2)

Есть ли способ, которым я могу рекурсивно справиться с этим?

  • 0
    Немного неясно, что вы хотите от полученного набора строк. Технически говоря, вы можете отобразить входные данные на "1", "2", "3", ... , нет?
  • 0
    Да ... Но цель состоит в том, чтобы сохранить как можно большую часть контекста (т.е. усеченный префикс обеспечивает некоторый контекст. На самом деле у меня есть несколько наборов строк, таких как (city, CITY, ...), (country, COUNTRY ,. ..). Здесь желаемое сопоставление будет (city, city1, ...) (country, country1, ...). Кроме того, сопоставление только с строками "1", "2", "3" и т. Д. Не решает проблему. Исходный набор может сам содержать «1», «2», «3» право
Показать ещё 1 комментарий
Теги:
string
algorithm

1 ответ

0

Я предлагаю вам сделать следующее:

for each input string, s
    if (result.contains(s))
        result.add(s)
    else
        do
            s = next(s)
        while (result.contains(s))
        result.add(s);

где next(s) будет определяться как

split s into [prefixPart, numberPart]
num = numberPart == null ? 0 : numberPart+1
prefixLength = Math.min(prefixPart.length, 5 - num.length)
return prefixPart.substring(0, prefixLength) + num

т.е. next("citY") = "citY0" и next("cit45") = "cit46"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню