2015-03-28 3 views
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», ... ', no? – aioobe

+0

Да, но намерение состоит в том, чтобы сохранить как можно больше контекста (т. Е. Усеченный префикс предоставляет некоторый контекст. На самом деле у меня есть несколько наборов строк, таких как (город, ГОРОД, ...), (страна, СТРАНА, ...). Здесь желаемое отображение было бы (city, city1, ...) (страна, страна1, ...) Также отображение только строк «1», «2», «3» и т. Д. Не решает Первоначальный набор может сам содержать «1», «2», «3» справа –

+0

Но те '" 1 "," 2 "," 3 "' могли бы, конечно, выйти как «17», 18 »,« 19 ». Или есть другое ограничение, скрывающееся? – aioobe

ответ

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"

Смежные вопросы