Как abt создать новую строку с числом * = числом последнего символа строки?
StringBuffer bf = new StringBuffer();
for (int i = 0; i < source.length(); i++ ) {
bf.append('*');
}
Вот приложение C#, я записал, что это решает эту проблему.
берет
aabccacdcd
выводы
abcacd
Вероятно, выглядит довольно грязным, взял меня немного для получения, моя голова вокруг динамической длины шаблона укусила.
class Program
{
private static List<string> values;
private const int MAX_PATTERN_LENGTH = 4;
static void Main(string[] args)
{
values = new List<string>();
values.AddRange(new string[] { "a", "b", "c", "c", "a", "c", "d", "c", "d" });
for (int i = MAX_PATTERN_LENGTH; i > 0; i--)
{
RemoveDuplicatesOfLength(i);
}
foreach (string s in values)
{
Console.WriteLine(s);
}
}
private static void RemoveDuplicatesOfLength(int dupeLength)
{
for (int i = 0; i < values.Count; i++)
{
if (i + dupeLength > values.Count)
break;
if (i + dupeLength + dupeLength > values.Count)
break;
var patternA = values.GetRange(i, dupeLength);
var patternB = values.GetRange(i + dupeLength, dupeLength);
bool isPattern = ComparePatterns(patternA, patternB);
if (isPattern)
{
values.RemoveRange(i, dupeLength);
}
}
}
private static bool ComparePatterns(List<string> pattern, List<string> candidate)
{
for (int i = 0; i < pattern.Count; i++)
{
if (pattern[i] != candidate[i])
return false;
}
return true;
}
}
зафиксированный начальные значения для соответствия значениям вопросов
Править: внесенный некоторые изменения и новые предложения
Что относительно раздвижного окна...
REMOVE LENGTH 2: (no other length has other matches)
//the lower case letters are the matches
ABCBAbabaBBCbcbcbVbvBCbcbcAB
__ABCBABABABBCBCBCBVBVBCBCBCAB
REMOVE LENGTH 1 (duplicate characters):
//* denote that a string was removed to prevent continual contraction
//of the string, unless this is what you want.
ABCBA*BbC*V*BC*AB
_ABCBA*BBC*V*BC*AB
RESULT:
ABCBA*B*C*V*BC*AB == ABCBABCVBCAB
Это, конечно, запускается с length=2, увеличьте его до L/2 и выполните итерации вниз.
Я также думаю о двух других подходах:
Я вывел бы их всех в Вашу любимую реализацию Набора.
Править: Теперь, когда я понимаю вопрос, Ваше исходное решение похоже на лучший способ сделать это. Просто цикл через массив однажды, сохраняя массив флагов для маркировки, который элементы сохранить, плюс в противоречии с отслеживают к размеру нового массива. Затем цикл через снова для копирования всех хранителей в новый массив.
Я соглашаюсь, что, если можно просто вывести строки в Набор, затем это могло бы быть самым легким решением.
Если бы у Вас нет доступа к реализации Набора по некоторым причинам, я просто отсортировал бы строки в алфавитном порядке и затем прошел бы однажды и удалил бы дубликаты. То, как отсортировать их и удалить дубликаты из списка, будет зависеть от того, какой язык и среда Вы выполняете свой код.
Править: О, ick.... Я вижу на основе Вашего разъяснения, что Вы ожидаете, что шаблоны могли бы произойти даже по отдельным строкам. Мой подход не решит Вашу проблему. Прошу прощения. Вот вопрос для Вас. Если у меня был следующий файл.
a
a
b
c
c
a
a
b
c
c
Вы ожидали бы, что это упростит до
a
b
c