Лучший способ уменьшить последовательности в массиве строк

Как abt создать новую строку с числом * = числом последнего символа строки?

StringBuffer bf = new StringBuffer();
for (int i = 0; i < source.length(); i++ ) {
    bf.append('*');
}
6
задан Community 23 May 2017 в 11:48
поделиться

4 ответа

Вот приложение 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;
    }
}

зафиксированный начальные значения для соответствия значениям вопросов

1
ответ дан 17 December 2019 в 07:10
поделиться

Править: внесенный некоторые изменения и новые предложения

Что относительно раздвижного окна...

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 и выполните итерации вниз.

Я также думаю о двух других подходах:

  1. диграф - Набор, которого диграф с сохранением информации с данными и выполняет итерации по нему со строкой, если цикл найден, у Вас будет дублирование. Я не уверен, насколько легкий это - проверка проверки на эти циклы... возможно некоторое динамическое программирование, таким образом, это мог быть equivlent к методу 2 ниже. Я оказываюсь перед необходимостью думать об этом также дольше.
  2. матрица расстояния - использование levenstein матрицы расстояния Вы смогли обнаруживать дублирование от диагонального перемещения (от диагонали) со стоимостью 0. Это могло указать на дублирование данных. Я должен буду думать об этом больше.
2
ответ дан 17 December 2019 в 07:10
поделиться

Я вывел бы их всех в Вашу любимую реализацию Набора.

Править: Теперь, когда я понимаю вопрос, Ваше исходное решение похоже на лучший способ сделать это. Просто цикл через массив однажды, сохраняя массив флагов для маркировки, который элементы сохранить, плюс в противоречии с отслеживают к размеру нового массива. Затем цикл через снова для копирования всех хранителей в новый массив.

1
ответ дан 17 December 2019 в 07:10
поделиться

Я соглашаюсь, что, если можно просто вывести строки в Набор, затем это могло бы быть самым легким решением.

Если бы у Вас нет доступа к реализации Набора по некоторым причинам, я просто отсортировал бы строки в алфавитном порядке и затем прошел бы однажды и удалил бы дубликаты. То, как отсортировать их и удалить дубликаты из списка, будет зависеть от того, какой язык и среда Вы выполняете свой код.

Править: О, ick.... Я вижу на основе Вашего разъяснения, что Вы ожидаете, что шаблоны могли бы произойти даже по отдельным строкам. Мой подход не решит Вашу проблему. Прошу прощения. Вот вопрос для Вас. Если у меня был следующий файл.

a

a

b

c

c

a

a

b

c

c

Вы ожидали бы, что это упростит до

a

b

c

0
ответ дан 17 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: